我不明白为什么下面的C#代码无法编译。
如您所见,我有一个带有IEnumerable<T>
参数的静态泛型方法Something (并且T
被限制为IA
接口),并且该参数不能隐式转换为IEnumerable<IA>
。
有什么解释?(我不是在寻找解决方法,只是为了了解为什么它不起作用)。
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”
8
为什么协变量和协变量不支持值类型的
—
Dirk,
您不限
—
德克
T
于引用类型。如果使用该条件,where T: class, IA
则它应该起作用。链接的答案具有更多详细信息。
@Dirk我不认为这应该标记为重复。虽然在概念上面对值类型确实是协方差/矛盾的问题,但这里的具体情况是“此错误消息表示什么”,而作者没有意识到仅仅包括“类”就解决了他的问题。我相信将来的用户会搜索此错误消息,找到这篇文章,并感到高兴。(就像我经常做的那样)
—
Reginald Blue
您也可以通过直接说出来来重现这种情况
—
杰普·斯蒂格·尼尔森
Something2(foo);
。不需要四处.ToList()
获取List<T>
(T
是您的泛型方法声明的类型参数)来理解这一点(a List<T>
是一个IEnumerable<T>
)。
@ReginaldBlue 100%,打算发布相同的内容。类似的答案不能重复提问。
—
UuDdLrLrSs '11年