Dot-Net

為什麼這個擴展方法在 VB.NET 中會拋出 NullReferenceException?

  • March 8, 2010

根據以前的經驗,我的印像是在空實例上呼叫擴展方法是完全合法的(儘管可能不是可取的)。所以在 C# 中,這段程式碼編譯並執行:

// code in static class
static bool IsNull(this object obj) {
   return obj == null;
}

// code elsewhere
object x = null;
bool exists = !x.IsNull();

但是,我只是為我的開發團隊的其他成員整理了一小套範常式式碼(我們剛剛升級到 .NET 3.5,我被分配了讓團隊加快開發一些新功能的任務可供我們使用),我編寫了我認為與上述程式碼等效的 VB.NET,結果發現它實際上拋出了一個NullReferenceException. 我寫的程式碼是這樣的:

' code in module '
<Extension()> _
Function IsNull(ByVal obj As Object) As Boolean
   Return obj Is Nothing
End Function

' code elsewhere '
Dim exampleObject As Object = Nothing
Dim exists As Boolean = Not exampleObject.IsNull()

調試器就停在那裡,就好像我呼叫了一個實例方法一樣。我是否做錯了什麼(例如,我在 C# 和 VB.NET 之間定義擴展方法的方式是否存在一些細微差別)?在 VB.NET 中呼叫空實例的擴展方法實際上是不合法的,儘管它在 C# 中是合法的嗎?(我會認為這是一個 .NET 的東西,而不是一個特定於語言的東西,但也許我錯了。)

有人可以向我解釋一下嗎?

您不能在 VB.NET 中擴展對像類型。

> > 主要是,我們不允許從靜態類型為“Object”的任何表達式中呼叫擴展方法。這對於防止您可能編寫的任何現有後期綁定程式碼被擴展方法破壞是必要的。 > > >

參考:

  • <http://blogs.msdn.com/vbteam/archive/2007/01/24/extension-methods-and-late-binding-extension-methods-part-4.aspx>
  • <http://johnwest.spaces.live.com/Blog/cns!EBA860160D5F5D75!463.entry>

引用自:https://stackoverflow.com/questions/2402660