用泛型类型调用的构造函数总是选择父类型,而存在更具体的构造函数

时间:2019-06-11 15:43:28

标签: c# generics

在下面的代码中,我重现了我遇到但无法理解的C#行为。

这个想法是: 具有类型约束的泛型类(此处为Parent)具有一种返回T的方法,根据实现的不同,该方法可以是Parentchild(从{ {1}})。 然后将返回的对象传递给一个类的构造函数,该类具有两个构造函数,一个接受Parent,另一个接受Parent

我期望的行为是,根据传递的对象的类型,将调用两个构造函数,但是仅调用接受Child的构造函数。

为什么会这样?我是否有办法获得预期的行为?

Parent

上面的程序给出以下输出:

internal class Program
{
    internal static void Main(string[] args)
    {
        new ParentLogicCode().DoAnInstanciation();
        new ChildLogicCode().DoAnInstanciation();

        Console.ReadKey();
    }

}

internal class InstanciatedFromGenericClass
{
    internal InstanciatedFromGenericClass(Child thinggy)
    {
        Console.WriteLine("Constructor with Child type called");
    }

    internal InstanciatedFromGenericClass(Parent thinggy)
    {
        Console.WriteLine("Constructor with Parent type called while acutal type is: " + thinggy.GetType());
    }
}

internal abstract class LogicCode<T> where T : Parent
{
    public void DoAnInstanciation()
    {
        var thinggy = GetThinggy();
        Console.WriteLine("Instanciating with type: " + thinggy.GetType());
        var instance = new InstanciatedFromGenericClass(thinggy);
    }

    protected abstract T GetThinggy();
}

internal class ParentLogicCode : LogicCode<Parent>
{
    protected override Parent GetThinggy() => new Parent();
}

internal class ChildLogicCode : LogicCode<Child>
{
    protected override Child GetThinggy() => new Child();
}

internal class Parent{}
internal class Child : Parent{}

我们目前已通过使用以下代码解决了该问题,但我们更希望避免这样做,而这会违背泛型的目的...

Instanciating with type: GenericPolymorphismTest.Parent
Constructor with Parent type called while acutal type is: GenericPolymorphismTest.Parent
Instanciating with type: GenericPolymorphismTest.Child
Constructor with Parent type called while acutal type is: GenericPolymorphismTest.Child

0 个答案:

没有答案