【问题标题】:How to initialize a generic property with child class of generic type?如何用泛型类型的子类初始化泛型属性?
【发布时间】:2018-09-05 07:48:02
【问题描述】:

我想用其中一个子类填充一个通用属性。但我得到这个错误:

无法将类型“Child1”隐式转换为“T”

我该怎么做?

例如:

考虑这些父类和子类:

public abstract class Parent
{
    public int P1 { get; set; }

    public abstract int DoSomething();
}
public class Child1 : Parent
{
    public override int DoSomething() { return P1 * 2; }
}
public class Child2 : Parent
{
    public override int DoSomething() { return P1 * 3; }
}

同时考虑这个示例泛型类:

public class Sample<T> where T: Parent
{
    T ChildObject { get; set; }

    public int Test()
    {
        ChildObject = new Child1 { P1 = 2 }; // Error: Cannot implicitly convert type 'Child1' to 'T'

        return ChildObject.DoSomething();
    }
}

更多解释:

我的错误是我试图在泛型类中初始化子类。按照接受的答案,我应该添加新约束并执行ChildObject = new T { P1 = 2 };,然后使用ChildObject.DoSomething();


解决方案:

public class Sample<T> where T: Parent, new()
{
    T ChildObject { get; set; }

    public int Test()
    {
        ChildObject = new T { P1 = 2 }; // Fixed :)

        return ChildObject.DoSomething();
    }
}

【问题讨论】:

标签: c# generics inheritance initialization


【解决方案1】:

将您的 Sample 课程更改为:

public class Sample<T> where T : Parent, new()
{
    T ChildObject { set; get; }
    public Sample()
    {
        ChildObject = new T(); 
    }
}

您现在可以创建一个实例:

var sample = new Sample<Child2>();

为了让它工作,Child1Child2 需要有一个公共的无参数构造函数。这是记录在here

【讨论】:

  • 这意味着我可以使用Sample类中的父方法和属性。但如果我想使用子方法和属性,我应该在示例类之外使用它ChildObject.ParentMethod();sample.ChildObject.ChildMethod(); 非常感谢。
【解决方案2】:

下面是一个更具说明性的例子:

class Tiger : Mammal {}
class Zebra : Mammal {}

public class Sample<TAnimal> where TAnimal: Mammal
{
    TAnimal ChildObject { set; get; }
    void Test()
    {
        ChildObject = new Tiger(); // Error: Cannot implicitly convert type 'Tiger' to 'TAnimal'
    }
}

假设我们使用Zebra 代替TAnimal。它会给我们:

public class Sample<Zebra> where Zebra: Mammal
{
    Zebra ChildObject { set; get; }
    void Test()
    {
        ChildObject = new Tiger(); // Bang!
    }
}

ZebraTiger 都是哺乳动物,但这并不意味着斑马因此错误。

【讨论】:

    猜你喜欢
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 2020-03-15
    • 2016-04-11
    • 1970-01-01
    相关资源
    最近更新 更多