10

这里我们有一个简单的类层次结构,并使用具有类型约束的泛型new()

public abstract class Base 
{
}

public class Derived : Base
{
}

public class TestClass
{
    private void DoSomething<T>(T arg) where T : new()
    {
    }

    public void TestMethod()
    {
        Derived d1 = new Derived();
        DoSomething(d1); // compiles

        Base d2 = new Derived();
        DoSomething(d2); // compile error
    }
}

该代码无法在指示的行编译,并出现以下错误:

'Base' 必须是具有公共无参数构造函数的非抽象类型,才能将其用作泛型类型或方法 'Foo.DoSomething(T)' 中的参数 'T'

这个错误很清楚也很有意义,但我希望编译器能够理解Base(此时可以实例化的)的所有派生都有一个公共的无参数构造函数。

这在理论上对编译器来说是可能的吗?

4

2 回答 2

8

唉,你必须明确地给出类型

DoSomething<Derived>(d2);

理论上不可能创造出抽象的东西

于 2013-08-08T13:02:00.113 回答
2

新约束(C# 参考):

要使用新的约束,类型不能是抽象的。

来电:

Base d2 = new Derived();
DoSomething(d2);

你实际上是在做:

Base d2 = new Derived();
DoSomething<Base>(d2);

由于Base是抽象的,因此会发生编译错误。

所以,你必须明确地转换:

Base d2 = new Derived();
DoSomething((Derived) d2);

你怎么能确保编译器,任何人都放在那里的东西不是抽象的?

我看到的唯一方式是,如果我们得到一个像“must-inherit-to-non-astract”这样的关键字,然后创建public must-inherit-to-non-abstract abstract class Base. 在那之后,编译器可以确定,如果你将基实例放入你的方法中,那实际上将是一个子类,它是非抽象的,因此可以被实例化。

于 2013-08-08T13:02:08.573 回答