興味深い奇妙なことをしました - 誰かを助けることができるかもしれないと考えました。私はISNULLABLEの両方の呼び出しは、コンパイラによって同じように扱われるだろうが、それがないことを期待しVB.NETコンパイラはどの拡張オーバーロードを実行するかをどのように選択しますか?
How to check if an object is nullable?
Option Strict On
Module Test
' Call this overload 1
<Extension()>
Function IsNullable(obj As ValueType) As Boolean
Return False
End Function
' Call this overload 2
<Extension()>
Function IsNullable(Of T As {Structure})(obj As Nullable(Of T)) As Boolean
Return True
End Function
Sub Test()
' a is an integer!
Dim a As Integer = 123
' calling IsNullable as an extension method calls overload 1 and returns false
Dim result1 As Boolean = a.IsNullable()
' calling IsNullable as method calls overload 2 and returns true
Dim result2 As Boolean = IsNullable(a)
' why? surely the compiler should treat both those calls as equivalent
End Sub
End Module
:
は、この、この質問からNULL値可能なタイプでいくつかの楽しみから出てきましたケース。拡張メソッド呼び出しは、引数 "a"が変更されていなくても、通常のメソッド呼び出しに対して異なるオーバーロードを使用します。
私の質問はなぜですか?コンパイラは2つの呼び出しの間にその心を変えますか?
FTR:我々のVisual Studio 2010を使用している、.NET Frameworkの4
あなたの質問はあなたがテストサブでISNULLABLEの両方の呼び出しが使用されている同じ過負荷になると思うだろう」明確ではないが、実際に彼らそれぞれが別のものを使用してください。 –
取得ポイント私は自分のコードにいくつかのコメントを追加しました。これが物事をはっきりさせることを望みます。 –