加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

为什么这个扩展方法在VB.NET中抛出NullReferenceException?

发布时间:2020-12-16 23:53:28 所属栏目:大数据 来源:网络整理
导读:从以往的经验来看,我一直觉得在null实例上调用扩展方法是完全合法的(尽管也许不太可取)。所以在C#中,这段代码编译并运行: // code in static classstatic bool IsNull(this object obj) { return obj == null;}// code elsewhereobject x = null;bool exi
从以往的经验来看,我一直觉得在null实例上调用扩展方法是完全合法的(尽管也许不太可取)。所以在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中的null实例上调用扩展方法实际上是不合法的,尽管它在C#中是合法的? (我会以为这是一个.NET的东西,而不是一个特定于语言的东西,但也许我错了)

有人可以向我解释一下吗

您不能在VB.NET中扩展对象类型。

Mainly,we do not allow extension methods to be called off of any expression that is statically typed as “Object”. This was necessary to prevent any existing late bound code you may have written from being broken by extension methods.

参考:

> 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读