比较整数和整数?结果是布尔值?不是布尔值

时间:2009-05-28 10:51:10

标签: .net vb.net compiler-construction

我只是编写了一些代码来比较整数的id和整数的id?例如:

Dim id As Integer = 1
Dim nullId As Integer? = Nothing
Dim areEqual As Boolean
areEqual = nullId = id

当我尝试编译代码时,出现编译错误:

Option Strict On disallows implicit conversions from 'Boolean?' to 'Boolean'.

虽然对我来说解决这个问题非常简单,但我希望有人能够解释编译器中发生的事情以发出此警告。

5 个答案:

答案 0 :(得分:7)

这是可空类型的怪癖之一。 NULL(一般而言)表示“不知道”。将已知未知进行比较会导致未知(因为您不知道它们是否相同)。

.NET中的可空类型也是如此。将Integer?Integer进行比较会产生Boolean?,因为您可能会TrueFalse或“不知道”。

答案 1 :(得分:3)

这是编译器为可空类型生成运算符的方式的一个不幸结果。您可以使用以下代码解决此问题:

Dim AreEqual As Boolean = If(nullId, 0) = id

此处If对应于C#的null coalesce operator,是以下内容的快捷方式:

Dim AreEqual As Boolean = If(nullId.HasValue, nullId.Value, 0) = id

答案 2 :(得分:0)

您正在尝试将类型(整数)与可空类型(整数?)进行比较。

您需要检查nullID的实际值,但不要忘记您需要检查nullId是否为空。

答案 3 :(得分:0)

发生编译错误,因为Option Strict On不允许来自'Boolean?'的隐式转换到'布尔'。而你正试图分配一个'布尔?' ('Integer?'='Integer'的结果)为'Boolean'。

通常在语言标准中禁用隐式转换,以避免意外错误。添加显式转换很容易;在不知情的情况下找到你在代码中放置的隐式转换可能很难。

可空类型和普通类型的不同足以避免它们之间的隐式转换。

答案 4 :(得分:0)

Null具有值“我不知道值是什么”,并且根据定义,其中一个操作数为null的任何操作都会返回null。例如。 2 = null结果为null,因此得到的值来自int = int?必须具有null作为可能的值,而不仅仅具有值true和false。布尔?是具有该组值的类型,因此是该操作的返回类型。

允许的唯一隐式转换是那些始终有效的。你可以隐式地将int转换为long。但不是很长的int(你可以明确地做到这一点),因为后者可能会导致信息丢失。如果数字大于int.MaxValue。 在这种情况下,您将尝试取消设置一个空值,这将导致运行时异常。