簡體   English   中英

new()和抽象基類的泛型類型約束

[英]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);

從理論上講,不可能創造出抽象的東西

新約束(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 在那之后,編譯器可以肯定,如果你將基本實例放入你的方法中,那實際上是一個子類,它是非抽象的,因此可以實例化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM