我有两个问题:
问题1背景: 我在注意到Microsoft的LINQ中'AsEnumerable()'方法的实现时注意到了:
public static IEnumerable<TSource> AsEnumerable<TSource>(this IEnumerable<TSource> source)
{
return source;
}
问题1: 我期待某种铸造或某种东西在这里,但它只是返回它传递的值。这是如何运作的 ?
问题2/3背景: 我一直试图理解协方差,逆变和不变性。我认为,我有一个模糊的理解,即'in'和'out'关键字确定将子类型分配给父类型时的多态行为。
问题2: 我从阅读中知道IEnumerable是协变的,而List是不变的,那为什么这是不可能的:
List<char> content = "testString".AsEnumerable();
问题3:
如果IList实现IEnumerable,那为什么这是不可能的:
IEnumerable<char> content1 = "testString";
IList<char> content2 = content1;
请帮助我理解,提前谢谢。
答案 0 :(得分:3)
已知输入参数的类型为IEnumerable<TSource>
。为什么需要施展任何东西?将对象转换为类型TSource
将无效,因为它们已经保证属于该类型(或更多派生类型)。
您无法将类型IEnumerable<char>
的值分配给List<char>
类型的变量。我想你在这里反思; List<char>
来自IEnumerable<char>
,而不是相反。这与List<T>
不变量无关。 IEnumerable<T>
是协变的(更准确地说,类型参数T
是协变的),这给了我们这种情况:
IEnumerable enumerable = Enumerable.Empty<string>(); // Allowed
IEnumerable<string> genericEnumerable = enumerable; // Not allowed
同样,IList<char>
继承自IEnumerable<char>
,而不是相反。你可以这样做:
IList<char> content1 = "testString".ToList();
IEnumerable<char> content2 = content1;
你所要求的是没有意义的,我害怕,这与协方差无关。 IEnumerable<T>
是协变的事实意味着您可以这样做:
IEnumerable<object> asObject = new List<string>() { "test" };
但是List<T>
是不变的,所以你不能这样做:
List<object> asObject = new List<string>() { "test" };