C# Can';t赋值类型为';T';到类型为';T';
我编写的代码避免了Convert.ChangeType()的开销。但我有一个小细节被挂断了,如下所示C# Can';t赋值类型为';T';到类型为';T';,c#,.net,generics,.net-core,C#,.net,Generics,.net Core,我编写的代码避免了Convert.ChangeType()的开销。但我有一个小细节被挂断了,如下所示 public void GetValue(out T value) { if (typeof(T) == typeof(string)) value = (T)""; // <== Cannot convert 'string' to 'T' // ... } public void GetValue(out T值) { if(t
public void GetValue(out T value)
{
if (typeof(T) == typeof(string))
value = (T)""; // <== Cannot convert 'string' to 'T'
// ...
}
public void GetValue(out T值)
{
if(typeof(T)=typeof(string))
value=(T)“;//首先需要将其强制转换为对象:
value = (T)(object)"";
即使您已经检查了类型兼容性,编译器也没有考虑这一点。就这一点而言,您有一个t
和一个string
,但没有直接转换。您必须首先将字符串弹回到对象
(有直接转换)然后强制转换到T
,就编译器而言,这可能会失败,但不会,因为您已经检查了类型!您需要先将其强制转换到对象
:
value = (T)(object)"";
即使您已经检查了类型兼容性,编译器也没有考虑这一点。就这一点而言,您有一个t
和一个string
,但没有直接转换。您必须首先将字符串弹回到对象
(有直接转换)然后强制转换到T
,就编译器而言,它可能会失败,但不会,因为您已经检查了类型!谢谢。您是否知道,如果跳到对象
会增加很多开销?这是一个运行时检查,与任何其他向下转换一样。我不会太担心它!现在是编译时间强制转换到对象
只会删除编译器关于字符串值的静态类型信息,因此它不会阻止将字符串强制转换到t
@Sean-boxing(这是很有可能的,因为OP没有显示它们对t的限制)可能真的很容易导致显著的性能成本…@AlexeiLevenkov-if
语句检查了T
是一个字符串
,因此将其强制转换到对象
不需要装箱。谢谢。你知道这是否会给对象
增加很多开销吗?这是一个运行时检查,与任何其他的负面影响。我不会太担心它!这是编译时信息。强制转换到对象
只会删除编译器关于字符串值的静态类型信息,因此它不会阻止将字符串强制转换到t
@Sean boxing(这很可能是因为OP没有显示它们对t的限制)可能真的很容易导致显著的性能成本…@AlexeiLevenkov-如果
语句检查了T
是一个字符串
,那么将其转换为对象
不需要装箱。