【问题标题】:Can't assign value of type 'T' to instance of type 'T' [duplicate]无法将“T”类型的值分配给“T”类型的实例 [重复]
【发布时间】:2020-07-17 16:38:06
【问题描述】:

我正在编写避免Convert.ChangeType() 开销的代码。但是我有点挂断了,如下图所示。

public void GetValue(out T value)
{
    if (typeof(T) == typeof(string))
        value = (T)""; // <== Cannot convert 'string' to 'T' 

    // ...

}

我有一个我知道是T 类型的值,但是如何以最小的开销将该值分配给T 类型的实例?我真的希望有一些快速而简单的东西。否则,我将废弃我的代码并在 try...catch 块中使用 Convert.ChangeType()

【问题讨论】:

    标签: c# .net generics .net-core


    【解决方案1】:

    您需要先将其转换为object

    value = (T)(object)"";
    

    即使您检查了类型兼容性,编译器也不会查看此内容。就它而言,您有一个T 和一个string,它们没有直接演员表。您必须首先将字符串反弹到object(有直接转换),然后转换为T,就编译器而言,这可能会失败,但不会因为您已经检查过类型!

    【讨论】:

    • 谢谢。您是否知道返回到object 是否会增加很多开销?
    • 这是一个运行时检查,与任何其他向下转换相同。我不会太担心它!
    • 这是编译时信息。转换为 object 只会删除编译器关于字符串值的静态类型信息,因此它不会拒绝将字符串转换为 T
    • @Sean 拳击(这很有可能,因为 OP 没有显示他们对 T 的限制)很容易导致显着的性能成本......
    • @AlexeiLevenkov - 他的if 声明已检查Tstring,因此将其转换为object 不需要拳击。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 2021-09-21
    • 1970-01-01
    • 2020-11-25
    • 2017-12-29
    • 2019-01-31
    • 2019-11-17
    相关资源
    最近更新 更多