2016-03-08 132 views
4

我正在破解一些舊的VB代碼,並且我想要一個函數在發現異常時提前返回,但如果它是System.UnauthorizedAccessException,函數應該繼續。只是所以我沒有得到XY'ed,我知道這是一個奇怪的要求,但我用C#重寫了代碼,我只需要看看這個結果。我知道可能有更好的方法來做到這一點。這裏是原代碼:這是爲什麼用「Is」編譯而不用「IsNot」編譯?

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 。它也完全符合TypeOf的示例代碼MSDN。但是,這段代碼無法編譯。如果我把上面一行

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 

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 

然後一切編譯和運行良好:我得到這個錯誤。 (Sans邏輯向後)

我正在使用visual studio 2013,並以.net framework 2.0爲目標。

那麼IsNot無效的原因是什麼?

+0

您是否可以在用於構建項目的Visual Studio版本和Framework版本上添加一些信息? – Steve

+5

應該是'如果不是TypeOf ex是System.UnauthorizedAccessException'。簡短回答:** IsNot運算符不能用於比較從TypeOf運算符返回的表達式。相反,您必須使用Not和Is運算符。**請參閱[Here](https://msdn.microsoft.com/en-us/library/t3bat82c.aspx) – Codexer

+2

在VS2015之前,TypeOf var Is語法是所有支持的。請參閱:[https://msdn.microsoft.com/en-us/library/0ec5kw18(v=vs.120).aspx#Anchor_1](https://msdn.microsoft.com/en-us/library/0ec5kw18 (v = vs.120).aspx#Anchor_1) – TnTinMn

回答

5

如您在Visual Studio 2015年有它它的工作存在的,但如果你看看VS2013 version of the docs,你我們只會列出TypeOf ... Is,因此您需要使用Not TypeOf ... Is

目標.NET Framework版本沒有什麼區別。如果您使用VS2015,則將編譯TypeOf ... IsNot

0

IsNot沒有預2.0 .NetVB.Net

If Not TypeOf ex Is 

這句法來自vb6

+0

這可能是需要的,但OP不是「pre 2.0 .Net」 「所以理由是不正確的。 – CoderDennis