我有以下课程:
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>
派生的。您无法真正表达要声明的类与类型参数之间的关系。