簡體   English   中英

顯式強制轉換運算符與T一樣

[英]Explicit cast operator vs as with T

因此,我遇到了以下“問題”,並且我真的對其背后的原因感到好奇。

考慮以下:

public class B
{

}

public class A<T>
{
    private void AFunc(T t)
    {
        FuncRequireB((B)t); // Not allowed
        FuncRequireB(t as B); // Allowed
    }

    private void FuncRequireB(B b)
    {

    }
}

我知道一種優雅的解決方案是在課堂上將T定義為B,但是我想知道為什么在這種情況下“(B)t”和“ t as B”不同。 我知道“ as”是安全的,因此如果無法完成轉換,它只能生成null,另一方面,如果轉換不成功,顯式強制轉換會引發異常,但是為什么編譯器應該關心這一點? 在這種情況下,我認為它們之間沒有區別。

先感謝您!

不同之處在於,如果編譯器知道一個轉換, 通常強制轉換可以執行用戶定義的轉換。 對於泛型類型,編譯器沒有該信息。 如果只想執行直接參考轉換轉換,則可以先轉換為object

FuncRequireB((B)(object) t);

老實說,可用轉換的這方面對我來說從來都不是清楚-但它確實有效。

請注意,如果您仍然可以將T約束為與B類型兼容,那會更干凈。 如果您的類型僅適用於特定的類型參數,則它不是很通用。

暫無
暫無

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

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