在表达的其余部分之前评估CType

Edu*_*ada 1 vb.net

我正在尝试像这样编写函数的return语句

Return (Not IsDbNull(result)) And (CType(result, String) = "1")
Run Code Online (Sandbox Code Playgroud)

但是,如果resultDbNull,它将引发我一个InvalidCastException

(Not IsDbNull(result)) And 2/0 = 1在我的手表中写作,所以在我看来,这个CType函数有一些特殊的东西,可以在表达的其余部分之前进行评估.

我看到的东西或CType不尊重VB.NET中的评估顺序吗?有没有解决这个问题的方法,不涉及将我的表达式分成几个部分并将它们分配给变量?

Tim*_*ter 5

您应该几乎总是使用AndAlso而不是And (而OrElse不是Or).

如果编译的代码可以根据另一个表达式的结果绕过一个表达式的评估,则称逻辑操作是短路的.如果第一个表达式求值的结果确定了操作的最终结果,则无需计算第二个表达式

And 另一方面,将评估导致此异常的两个表达式:

Boolean比较中,And运算符始终评估两个表达式

您也可以使用Convert.ToString该条约NothingDbNull空字符串:

Return Convert.ToString(result) = "1"
Run Code Online (Sandbox Code Playgroud)

  • @EduardoWada:我还没有对它进行过测试,但我认为这是由另一个VB.NET奇怪引起的:如果你使用`2/0'你没有得到预期的`DivideByZeroException`,因为它不是整数除法(因为它在C#).VB.NET将其视为双重导致无穷大.如果使用VB.NET整数除法运算符,它应该导致预期的异常:`2\0` (2认同)