我有以下课程:

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>派生的。

您无法真正表达要声明的类与类型参数之间的关系。

07-24 13:57