我只是编写了一些代码来比较整数的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'.
虽然对我来说解决这个问题非常简单,但我希望有人能够解释编译器中发生的事情以发出此警告。
答案 0 :(得分:7)
这是可空类型的怪癖之一。 NULL(一般而言)表示“不知道”。将已知与未知进行比较会导致未知(因为您不知道它们是否相同)。
.NET中的可空类型也是如此。将Integer?
与Integer
进行比较会产生Boolean?
,因为您可能会True
,False
或“不知道”。
答案 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。 在这种情况下,您将尝试取消设置一个空值,这将导致运行时异常。