我不明白为什么下面的C#代码无法编译。
如您所见,我有一个静态泛型方法Something,它有一个IEnumerable参数(其中T被限制为IA接口),并且这个参数无法隐式转换为IEnumerable。
这是为什么呢?(我不是在寻找解决方法,只是想理解为什么它不起作用)。
如您所见,我有一个静态泛型方法Something,它有一个IEnumerable参数(其中T被限制为IA接口),并且这个参数无法隐式转换为IEnumerable。
这是为什么呢?(我不是在寻找解决方法,只是想理解为什么它不起作用)。
public interface IA { }
public interface IB : IA { }
public class CIA : IA { }
public class CIAD : CIA { }
public class CIB : IB { }
public class CIBD : CIB { }
public static class Test
{
public static IList<T> Something<T>(IEnumerable<T> foo) where T : IA
{
var bar = foo.ToList();
// All those calls are legal
Something2(new List<IA>());
Something2(new List<IB>());
Something2(new List<CIA>());
Something2(new List<CIAD>());
Something2(new List<CIB>());
Something2(new List<CIBD>());
Something2(bar.Cast<IA>());
// This call is illegal
Something2(bar);
return bar;
}
private static void Something2(IEnumerable<IA> foo)
{
}
}
Something2(bar)
行中出现的错误:
参数 1: 无法将类型为 'System.Collections.Generic.List' 的对象转换为类型 'System.Collections.Generic.IEnumerable'
T
限制为引用类型。如果您使用条件where T:class,IA
,那么它应该可以工作。链接的答案有更多细节。 - DirkSomething2(foo);
来重现这种情况。不需要绕过.ToList()
来获取List<T>
(T
是由泛型方法声明的类型参数)以理解这一点(List<T>
是IEnumerable<T>
)。 - Jeppe Stig Nielsen