【问题标题】:Why does this compile with "Is" but not with "IsNot"?为什么用“Is”编译而不用“IsNot”编译?
【发布时间】:2016-03-08 20:42:47
【问题描述】:

我正在破解一些旧的 VB 代码,如果捕获到异常,我希望函数能够提前返回,但如果是 System.UnauthorizedAccessException,函数应该继续。就这样我没有得到XY'ed,我知道这是一个奇怪的要求,但我正在用C#重写代码,我只需要看看这个结果。我知道可能有更好的方法来做到这一点。这是原始代码:

Try
    doSomeStuffWithFiles(files)
Catch ex As Exception
    MsgBox("Far Field: error in reading / writing to far field file." & Chr(13) & ex.Message)
    Exit Sub
End Try

所以我添加了几行:

Catch ex As Exception
    MsgBox("Far Field: error in reading / writing to far field file." & Chr(13) & ex.Message)
    If TypeOf ex IsNot System.UnauthorizedAccessException Then
        Exit Sub
    End If
End Try

现在,我不是 VB 专家,但据我所知,这是完全有效的 VB。它还与MSDN 上的TypeOf 的示例代码完全匹配。但是,此代码无法编译。我收到此错误:

Error   21  'Is' expected.  C:\FilePath 3114    26  Project
Error   22  'UnauthorizedAccessException' is a type in 'System' and cannot be used as an expression.    C:\FilePath 3114    32  Project

如果我将该行更改为

Catch ex As Exception
    MsgBox("Far Field: error in reading / writing to far field file." & Chr(13) & ex.Message)
    If TypeOf ex Is System.UnauthorizedAccessException Then
        Exit Sub
    End If
End Try

然后一切都编译并运行良好。 (没有倒退的逻辑)

我使用的是 Visual Studio 2013,目标是 .net 框架 2.0。

那么IsNot无效的原因是什么?

【问题讨论】:

  • 您能否添加一些有关用于构建项目的 Visual Studio 版本和框架版本的信息?
  • 应该是If Not TypeOf ex Is System.UnauthorizedAccessException。简短回答:IsNot 运算符不能用于比较从 TypeOf 运算符返回的表达式。相反,您必须使用 Not 和 Is 运算符。 请参阅 Here
  • 在 VS2015 之前,仅支持 TypeOf var Is 语法。见:https://msdn.microsoft.com/en-us/library/0ec5kw18(v=vs.120).aspx#Anchor_1
  • @TnTinMn 我赞成将其作为答案
  • @CoderDennis,谢谢,但 OP 的真正问题应该是:“如何使用文档?”在阅读问题后,我看到有一个指向最新文档版本的链接。 OP 以防万一您不知道,您可以单击文档中的“其他版本”下拉菜单以查看早期文档。有一次,这样做是谨慎的做法,以便您可以查看最新版本中缺少的“社区添加”部分。

标签: vb.net


【解决方案1】:

它可以像在 Visual Studio 2015 中一样工作,但如果您查看 VS2013 version of the docs,您只会看到列出的 TypeOf ... Is,因此您需要使用 Not TypeOf ... Is

目标 .NET Framework 版本没有区别。如果您使用的是 VS2015,TypeOf ... IsNot 将编译。

【讨论】:

    【解决方案2】:

    IsNot 之前不存在 2.0 .Net VB.Net

    If Not TypeOf ex Is
    

    此语法来自vb6

    【讨论】:

    • 这可能是需要的,但 OP 不是“pre 2.0 .Net”,所以原因不正确。
    猜你喜欢
    • 2012-02-14
    • 2017-01-11
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 2017-10-19
    • 2017-10-12
    • 2020-12-04
    • 1970-01-01
    相关资源
    最近更新 更多