C# Can';t赋值类型为';T';到类型为';T';

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

我编写的代码避免了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(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
是一个
字符串
,那么将其转换为
对象
不需要装箱。