2017-09-13 164 views
0

我有一個擴展方法:爲什麼不能在T類型的值上使用Nullable <T>的擴展?

public static int DoStuff(this MyEnum? enumValue) 
{ 
    ... 
} 

我想要調用它在其已知是不爲空的MyEnum值:

MyEnum enumVal = ... 
var x = enumVal.DoStuff(); // compiler error! 

錯誤:

error CS1928: 'MyEnum' does not contain a definition for 'DoStuff' and the best extension method overload 'MyExtensions.DoStuff(MyEnum?)' has some invalid arguments

我可以通過聲明擴展的過載來解決它:

public static int DoStuff(this MyEnum enumValue) 
{ 
    return DoStuff((MyEnum?)enumValue); 
} 

或者,我可以明確地調用擴展類:

var x = MyExtensions.DoStuff(enumVal); 

但是,這是不直觀。爲什麼Nullable<T>的擴展名不能接受類型爲T的值,就像任何常規方法簽名一樣?

+3

原因'MyEnum'不能爲空 – Rahul

+1

它們不是同一類型。 –

+0

除了'Nullable '絕對不是'T'。 –

回答

5

基本上,擴展方法(與方法參數相反)不考慮隱式轉換。而MyEnum? value = nonNullableMyEnumValue正在使用隱式轉換,它不是同一類型。你會遇到與其他隱式可轉換類型相同的情況。

相關問題