[英]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.