2014-01-29 219 views
3

鑑於這種虛構的例子:爲什麼我不能將派生泛型類型轉換爲基類非泛型類型(通過約束)?

class NonGeneric 
{ 
} 

class Generic<T> : NonGeneric 
    where T : NonGeneric 
{ 
    T DoSomething() 
    { 
     return this; // ** 
    } 
} 

我希望它編譯:Generic<T>NonGenericT派生必須在一個派生類,所以它滿足其約束。

我應該能夠做到這一點:

NonGeneric obj = new Generic<NonGeneric>(); 

那麼就應該有這個指令沒有問題:

return this; 

或者至少是這樣的:

return (T)this; 

不幸的是,不起作用,上面的示例不會編譯錯誤:

Cannot convert type NonGeneric<T> to ' T '

我做錯了什麼,我看不到它,或者它只是不被允許?爲什麼這個?


我將避免,如果可能的話,像一個解決方法的任何我描述in this post(反射,動態編譯的方法等)。我也會避免dynamic對象(設計決定,我不能改變)。

回答

2

你試過這個嗎?

T DoSomething() 
{ 
    return this as T; 
} 

this是不是隱含一樣T所以有必要將它轉換爲明確地在上面的例子。

+0

你是對的,即使我不明白原因,它也可以工作。我期望「(T)這個」工作(如果濫用,拋出「InvalidCastException」)。我真的無法想象,爲什麼「as」的作用與它應該像普通演員一樣。 –

7

thisNonGenericTNonGeneric,但this不一定T。從編譯器的角度來看,它們可能是不同的子類。

考慮類:

class Red : NonGeneric 
{ 
} 

那麼你的泛型類變爲:

class Generic<Red> : NonGeneric 
    where Red : NonGeneric // constraint satisfied 
{ 
    Red DoSomething() 
    { 
     return this; 
    } 
} 

thisRed,這是Generic<Red>,這是一個不同的子類的NonGenericRed

相關問題