【发布时间】:2017-10-19 16:45:32
【问题描述】:
我有以下课程:
public class Item<TItem>
where TItem : Item<TItem>
{
void GetReference()
{
TItem item = this;
}
}
此处TItem item = this; 生成编译器错误“无法将Item<TItem> 隐式转换为TItem”。
但是为什么我们需要在这里进行转换呢?我们已经定义了约束where TItem : Item<TItem>,所以可以认为根本不需要转换,因为这两种类型是相同的,不是吗?
顺便说一句,可以使用显式转换。这也在编译器错误中说明。
【问题讨论】:
-
您为什么认为
where子句描述了TItem的身份 及其约束?如果您说where TItem : Mammal,您会认为TItem必须是完全是哺乳动物,还是认为TItem必须是与Mammal兼容的任何类型,比如Tiger或Dog?我很想知道人们是如何对编程语言产生错误信念的;你认为where子句是什么意思,你是怎么知道的? -
我看着它想了想:“嗯,
TItem可以是Item<TItem>或任何派生出来的东西。所以由于我们目前在Item<TItem>类中工作,所以这个类(@ 的类型987654339@) 应该属于该类别,因此应该可以分配给TItem。”就这样,乔恩·斯基特(Jon Skeet)所描绘的案例悄悄地从我的脑海中溜走了。 -
知道了;谢谢!如果你对这个主题感兴趣,几年前我写了一篇关于它的文章。 blogs.msdn.microsoft.com/ericlippert/2011/02/03/… 我建议避免这种模式;正如您所发现的,这很难推理。
-
我已经阅读了我的评论几次,现在我犯的错误对我来说更清楚了。仍然很难就这个概念接受一些培训,因为它很难形象化。
标签: c# generics types constraints implicit