【发布时间】:2018-10-27 01:24:49
【问题描述】:
假设我有一个类似的设置
public interface IMyInterface { }
public class MyImplementation : IMyInterface { }
public class MyClass<T> where T : IMyInterface { }
我发现我不能像这样替换
var list = new List<MyClass<IMyInterface>>()
{
new MyClass<MyImplementation>()
}
因为我会得到错误
无法从
MyClass<MyImplementation>转换为MyClass<IMyInterface>
这是否意味着我正在尝试做的是代码异味?
【问题讨论】:
-
这是一个编译器错误,因此这意味着您尝试执行的操作在 c# 语言中是非法的。
-
您不能这样做,因为
List<T>中的T是不变的。换句话说,它必须是一种类型(它不能变化)。谷歌协变和逆变。这个问题在 SO 上也被问了太多次了。 -
我认为您要研究的是 C# 中的泛型方差,两个关键术语是协方差和反方差。我不会给出答案,因为它可能无法很好地涵盖它,因为它仍然让我头疼,所以我的建议是查找这些术语,直到更有知识的人可以给你一个好的答案跨度>