[英]Generic type constraint of new() and an abstract 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
}
}
代码无法在指定的行编译,错误为:
'Base'必须是具有公共无参数构造函数的非抽象类型,以便在泛型类型或方法'Foo.DoSomething(T)'中将其用作参数'T'
这个错误是明确的,也是有道理的,但我曾希望编译器能够理解Base
所有派生(可以在这一点实例化)都有一个公共无参数构造函数。
理论上这对编译器来说是否可行?
唉,你必须明确给出类型
DoSomething<Derived>(d2);
从理论上讲,不可能创造出抽象的东西
要使用新约束,类型不能是抽象的。
呼叫:
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
。 在那之后,编译器可以肯定,如果你将基本实例放入你的方法中,那实际上是一个子类,它是非抽象的,因此可以实例化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.