new()的泛型类型约束和一个抽象基类

本文关键字:一个 基类 抽象 约束 泛型类型 new | 更新日期: 2023-09-27 18:26:49

这里我们有一个简单的类herarchy,以及具有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的所有派生(此时可以实例化)都有一个公共的无参数构造函数。

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

new()的泛型类型约束和一个抽象基类

遗憾的是,您必须显式地给出类型

DoSomething<Derived>(d2);

理论上不可能创建抽象的

新约束(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。在那之后,编译器可以确定,如果你把基实例放进你的方法中,那实际上是一个子类,它是非抽象的,因此可以实例化。