我希望针对Util.Check
和ParentA
类推广ParentB
方法。
但是,显示错误:无法从ParentA转换为IParent。
public interface IChild {}
public interface IParent<TChild> where TChild : IChild
{
public string message { get; set; }
List<TChild> list { get; set; }
}
public class ChildA : IChild { }
public class ChildB : IChild { }
public class ParentA : IParent<ChildA>
{
public string message { get; set; }
public List<ChildA> list { get; set; }
}
public class ParentB : IParent<ChildB>
{
public string message { get; set; }
public List<ChildB> list { get; set; }
}
public static class Util
{
public static IParent<IChild> Check<IParent>(IParent<IChild> parent)
{
parent.message = "test";
return parent;
}
}
var parentA = new ParentA();
var parentB = new ParentB();
var resultA = Util.Check<ParentA>(parentA); // got an error here
var resultB = Util.Check<ParentB>(parentB); // got an error here
错误显示:
Error CS1503 Argument 1: cannot convert from 'ParentA' to 'IParent<IChild>'
Error CS1503 Argument 1: cannot convert from 'ParentB' to 'IParent<IChild>'
答案 0 :(得分:2)
是的,没错-因为ParentA
不是 IParent<IChild>
。考虑一下如果允许的话会发生什么。下面的代码很好:
// Invalid code: if the first line were valid, the rest would be unsafe.
IParent<IChild> parent = new ParentA();
List<IChild> list = parent.list;
IChild child = new ChildB();
list.Add(child);
这只是将ChildB
添加到实际上是List<ChildA>
的对象中,从而破坏了类型安全性。但是,如果您可以将ParentA
视为IParent<IChild>
,那么每一行都是可以的。
通用方差允许在某些情况下完成这种事情,但规则确保这样做是安全的。在这种情况下,这样做是不安全的,因此被禁止。