c# - 为什么不能从泛型约束中隐式推断出 `this` 的类型转换?

标签 c# generics types constraints implicit

我有以下类(class):

public class Item<TItem>
    where TItem : Item<TItem>
{
    void GetReference()
    {
        TItem item = this;
    }
}

在这里TItem item = this;生成编译器错误“无法将 Item<TItem> 隐式转换为 TItem”。

但是为什么我们需要在这里进行转换呢?我们已经定义了约束 where TItem : Item<TItem> , 因此可以认为根本不需要转换,因为这两种类型是相同的,不是吗?

顺便说一句,显式转换是可用的。这也在编译器错误中说明。

最佳答案

因为这样不安全。考虑:

public class GoodItem : Item<GoodItem>
{
    // No problem
}

public class EvilItem : Item<GoodItem>
{
    // GetReference body would be equivalent to 
    // GoodItem item = this;
    // ... but this *isn't* a GoodItem, it's an EvilItem!
}

EvilItem满足 TItem 的约束没有问题 - GoodItem确实源自 Item<GoodItem> .

无法表达正在声明的和类型参数之间的关系,而这正是您真正想要的。

关于c# - 为什么不能从泛型约束中隐式推断出 `this` 的类型转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46834933/

相关文章:

c# - Umbraco 检查 - 查询问题

c# - 匹配方法内容的正则表达式

java - Jackson - 反序列化通用类变量

c# - 是否可以将泛型参数限制为当前对象的子类型?

c++ - 哪个值更好用? boolean 真还是整数 1?

javascript - 列类型的 Cassandra 代码?

c# - 在富文本框中定位列表框

c# - Prism 5.0 在 ViewModel 中包装模型属性

swift - 通用 Swift 函数错误 Swift 3.0

typescript - TS4023 : Exported Variable <x> has or is using name <y> from external module but cannot be named