在 MSDN(https://docs.microsoft.com/en-us/dotnet/standard/generics/)上,它說:
泛型方法可以出現在泛型或非泛型型別上。重要的是要注意,一個方法不是泛型僅僅因為它屬于泛型型別,或者甚至因為它具有其型別是封閉型別的泛型引數的形式引數。一個方法只有在它有自己的型別引數串列時才是泛型的。在下面的代碼中,只有方法 G 是通用的。
出于所有意圖和目的,M 不是通用的嗎?如果在 T 型別的某個實體上呼叫方法 M,M 只能具有 T 型別的輸入和輸出引數。使用這種非泛型方法 M 會有什么問題嗎?
class A
{
T G<T>(T arg)
{
T temp = arg;
//...
return temp;
}
}
class Generic<T>
{
T M(T arg)
{
T temp = arg;
//...
return temp;
}
}
uj5u.com熱心網友回復:
出于所有意圖和目的,M 不是通用的嗎?
如果您使用反射來檢查這些方法,您會發現IsGenericMethodandIsGenericMethodDefinition是 true A.G,而 false 是Generic<>.M。即使Generic<>.M的回傳型別為T,其IsGenericParameter屬性為 true 也是如此。
您在問一個關于語意的問題(即“泛型方法”的語言含義),微軟已經定義了這些概念的含義,因為它們與 C# 相關。所以當微軟說泛型方法是一個接受泛型型別引數的方法時,這就是開發人員和框架本身都將接受的定義。
如果在某個 T 型別的實體上呼叫方法 M,則 M 只能具有 T 型別的輸入和輸出引數。
是的,區別在于 type 的范圍T。例如,如果您有 的實體Generic<string>,則不能將其傳遞M給int。使用泛型方法,可以在方法級別更改泛型引數,而泛型類上的非泛型方法使用與其所屬類的泛型型別匹配的型別。
使用這種非泛型方法 M 會有什么問題嗎?
M在泛型類內部使用非泛型方法沒有“問題” 。這就是泛型類的作業方式。請注意我上面提到的行為差異。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/494518.html
