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

Ric*_*ett 10 c# generics abstract-class base-class

在这里,我们有一个简单的类层次结构,并使用具有类型约束的泛型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
    }
}
Run Code Online (Sandbox Code Playgroud)

代码无法在指定的行编译,错误为:

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

这个错误是明确的,也是有道理的,但我曾希望编译器能够理解所有派生的Base(可以在这一点实例化)都有一个公共的无参数构造函数.

理论上这对编译器来说是否可行?

lor*_*ain 8

唉,你必须明确给出类型

DoSomething<Derived>(d2);
Run Code Online (Sandbox Code Playgroud)

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

  • 我喜欢"理论上"的一部分.让我觉得Jon Skeet会流行,做一些魔法,然后你去,实例化抽象对象. (5认同)