【发布时间】:2011-01-25 01:12:54
【问题描述】:
根据之前的经验,我的印象是在空实例上调用扩展方法是完全合法的(尽管可能并不可取)。所以在 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 的东西,而不是特定于语言的东西,但也许我错了。)
谁能给我解释一下?
【问题讨论】:
-
IsNull 方法只是一个示例,还是您真的想使用 x.IsNull() 而不是 'x Is Nothing' 或 'x == null'?
-
@jrummell:这只是一个例子。正如我所提到的,我正在编写一些示例代码来说明扩展方法如何为我的一些团队成员工作。我打算让这个方法包含一个注释,“你实际上可以用扩展方法来做到这一点,尽管我不推荐它”——只是为了展示一个扩展方法实际上只是一个静态的(共享) 方法。但后来我发现我在 VB 中无法做到这一点,这让我很惊讶。
-
正如已经发现的那样,这是由于对后期绑定的支持......像你一样 (Dan) 我没有意识到 VB 对后期绑定有这样的支持,我猜这是一个兼容性问题用VB6。顺便说一句,如果您正在考虑为其他开发人员制定一些标准/培训,您可能希望强制使用 Option Strict,因为我认为它有助于解决很多潜在问题。当然是 YMMV。
标签: .net vb.net extension-methods nullreferenceexception