IEnumerable<T>是共变体,但它不支持值类型,仅支持引用类型.以下简单代码编译成功:
IEnumerable<string> strList = new List<string>();
IEnumerable<object> objList = strList;
Run Code Online (Sandbox Code Playgroud)
但是从更改string到int将得到编译错误:
IEnumerable<int> intList = new List<int>();
IEnumerable<object> objList = intList;
Run Code Online (Sandbox Code Playgroud)
原因在MSDN中解释:
差异仅适用于参考类型; 如果为变量类型参数指定值类型,则该类型参数对于生成的构造类型是不变的.
我搜索过并发现有些问题提到的原因是值类型和引用类型之间的装箱.但它仍然不清楚我的想法为什么拳击是什么原因?
有人可以给出一个简单而详细的解释为什么协方差和逆变不支持值类型以及拳击如何影响这个?
我已经看到类似的问题被提出和回答,但我\xe2\x80\x99m 仍在为我的简单实现而苦苦挣扎。我希望能够返回具有不同返回类型的类属性。然后我希望能够在集合中互换使用它们。
\n\npublic ClassInt\n{\npublic int Id { get; set; }\npublic string MyValue { get; set; }\n}\n\npublic ClassString\n{\npublic int Id { get; set; }\npublic int MyValue { get; set; }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n因此,除了 MyValue 的返回类型之外,这些类是相同的。\n这就是我到目前为止所得到的:
\n\npublic interface IBaseClass\n{\n int Id { get; set; }\n object Value { get; set; }\n}\n\npublic abstract class BaseClass <T> : IBaseClass\n{\n public int Id { get; set; }\n public abstract T Value { get; set; }\n}\n\npublic class ClassInt : BaseClass<int>\n{\n private int _value;\n public override …Run Code Online (Sandbox Code Playgroud)