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

问题描述:

我只是写了一段代码来比较一个整数的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'. 

虽然这很简单,我来解决这个问题,我希望有人也许能够请解释编译器中发生了什么以发出此警告。

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

它与.NET中的可为空类型相同。比较Integer?Integer的结果为Boolean?,因为您可能得到True,False或“不知道”。

这是编译器生成可为空类型的运算符的方式的一个不幸后果。你可以解决它通过使用下面的代码:

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

If这里对应于C#的null coalesce operator,是一个快捷方式:

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

您正在尝试的类型(整数)比作可空类型(整数?)。

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

发生编译器错误是因为Option Strict On禁止从'Boolean?'进行隐式转换。到'布尔'。你正试图分配一个'布尔?' ('Integer?'='Integer')的结果转换为'Boolean'。

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

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

+1

我想你错过了问题的肉,代码处理整数和整数?,报告的错误是布尔? – 2009-05-28 10:59:40

+0

“integer = integer?”导致一个“boolean?”,并且用户试图将它分配给一个“布尔”。但是,是的,我错过了第一个地方的细节:) – 2009-05-28 12:10:16

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

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