我有以下类和扩展类(以此为例):
由于List在继承树中比IEnumerable低,所以这应该是有效的,对吗?当然,如果我新创建一个Person >,那么它就有效,因为那是直接类型。
我正在尝试使用一个可以应用于所有Person的扩展方法,只要T实现了IEnumerable,因为我需要使用Any()方法。
编辑:也许我对协变的理解有误?我知道IEnumerable应该转换为IEnumerable,但IList不能转换为IEnumerable?
编辑2:忘记提到我正在使用.net 4.0。
我有以下类和扩展类(以此为例):
public class Person<T>
{
public T Value { get; set; }
}
public static class PersonExt
{
public static void Process<TResult>(this Person<IEnumerable<TResult>> p)
{
// Do something with .Any().
Console.WriteLine(p.Value.Any());
}
}
我原以为能够编写如下代码并使其工作,但实际上它并不能:
var x = new Person<List<String>>();
x.Process();
由于List在继承树中比IEnumerable低,所以这应该是有效的,对吗?当然,如果我新创建一个Person >,那么它就有效,因为那是直接类型。
我正在尝试使用一个可以应用于所有Person的扩展方法,只要T实现了IEnumerable,因为我需要使用Any()方法。
编辑:也许我对协变的理解有误?我知道IEnumerable应该转换为IEnumerable,但IList不能转换为IEnumerable?
编辑2:忘记提到我正在使用.net 4.0。
IList<T>
实现了ICollection<T>
,而ICollection<T>
又实现了IEnumerable<T>
,因此转换是被允许的,这种情况下它不需要是协变或逆变的。 - Nick Craver