为什么不能从通用约束中隐含地推断出"this"的类型转换?

Bru*_*ell 3 c# generics types constraints implicit

我有以下课程:

public class Item<TItem>
    where TItem : Item<TItem>
{
    void GetReference()
    {
        TItem item = this;
    }
}
Run Code Online (Sandbox Code Playgroud)

这里TItem item = this;生成编译器错误"无法Item<TItem>隐式转换为TItem".

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

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

Jon*_*eet 6

因为它不安全.考虑:

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!
}
Run Code Online (Sandbox Code Playgroud)

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

没有办法表达声明和类型参数之间的关系,这是你真正想要的.