无法将ParentA <ChildA>实例传递给通用方法(IParent <IChild>)

时间:2019-11-19 19:08:56

标签: c# interface

我希望针对Util.CheckParentA类推广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>'

1 个答案:

答案 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>,那么每一行都是可以的。

通用方差允许在某些情况下完成这种事情,但规则确保这样做是安全的。在这种情况下,这样做是不安全的,因此被禁止。