簡體   English   中英

C#:使用類泛型參數覆蓋泛型方法

[英]C#: Override generic method using class generic parameter

為什么這不可能?

abstract class A
{
    public abstract T f<T>();
}

class B<T> : A
{
    public override T f()
    {
        return default (T);
    }
}

錯誤:

does not implement inherited abstract member 'A.f<T>()'
no suitable method found to override

我知道簽名必須是相同的,但從我的角度來看,我認為沒有理由這是不允許的。 另外我知道另一個解決方案是制作A泛型而不是它的方法,但由於某些原因它不適合我。

這是不可能的,因為這些方法具有不同的簽名。 Af是泛型方法而Bf不是(它只使用類泛型參數)。

你可以從調用者的角度看這個形式:

A variableA = new A();
variableA.f<int>();

B<int> variableB = new B<int>();
variableB.f();

B不履行A的合同。

A允許使用任何類型參數調用f以返回該類型。 B不允許使用類型參數調用f ,只返回B類型參數的類型。

例如,假設您有一個B<int>並將其強制轉換為A (應該可以繼承它)。 然后你在它上面調用了f<bool>() (這應該是可能的,因為它是A )。 然后怎樣呢? 底層B<int>沒有調用方法。

B b = new B<int>();
// This is legal as B inherits from A
A a = b;
// This is a legal call, but how does b handle it?
bool result = a.f<bool>();

在您的代碼的情況下

abstract class A
{
    public abstract T f<T>();
}

class B<T> : A
{
    public override T f()
    {
        return default (T);
    }
}

你期望在下面的代碼中調用什么?

public void Foo(A myObj) {
    myObj.f<DateTime>();
}
Foo(new B<int>());

雖然類型契約(抽象類A)明確指出您需要實現,但該方法沒有實現。 因此,您可以實現或更改合同以在類級別使用類型參數

abstract class A<T>
{
    public abstract T f();
}

class B<T> : A<T>
{
    public override T f()
    {
        return default (T);
    }
}

確實編譯,但它當然也限制了f

可能這就是你打算做的事情:

abstract class A
{
    public abstract T f<T>();
}

class B<U> : A
{
    public override T f<T>() //also needs to have a generic type parameter
    {
        throw new NotImplementedException();
    }

    public U f()
    {
        return f<U>();
    }
}

泛型方法類型參數和泛型類類型參數(此處為TU )沒有直接連接,即T不限於基類中的U (或其他),並且您不能在派生類中更改此限制。

abstract class A
{
    public abstract T f<T>();
}

class B<T> : A
{
    public override T f<T>()
    {
        return default (T);
    }
}

暫無
暫無

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

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