2009-05-28 5 views
4

Я просто пишу немного кода для сравнения id целого числа с id целого числа? например:Сравнение целых чисел и целых чисел? приводит к Boolean? not Boolean

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'. 

Хотя это очень просто для меня, чтобы обойти эту проблему, я надеялся, что кто-то может быть в состоянии объясните, что происходит в компиляторе, чтобы дать это предупреждение.

ответ

7

Это один из причуд с нулевыми типами. NULL (в общих чертах) означает «не знаю». Сравнение с неизвестно Результаты неизвестен (потому что вы не знаете, одинаковы ли они).

Это то же самое с типами NULL в .NET. Сравнение Integer? с Integer приводит к Boolean?, так как вы можете получить True, False или «не знаете».

+0

Как насчет FileNotFound? ;-) –

+0

Для тех, кто пропустил ссылку: http://thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx –

3

Это неудачное следствие того, как компилятор генерирует операторы для типов с нулевым значением. Вы можете работать вокруг него, используя следующий код:

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

If здесь соответствует C# 's null coalesce operator и ярлык для:

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

Вы пытаетесь сравнить тип (целое число) к nullable type (integer?).

Вам необходимо проверить действительное значение nullID, но не забывайте, что вам нужно проверить, что nullId является нулевым.

0

Ошибка компилятора происходит из-за того, что опция Strict On запрещает неявные преобразования из 'Boolean?' на «Boolean». И вы пытаетесь присвоить 'Boolean?' (результат «Integer?» = «Integer») в «Boolean».

Неявные преобразования, как правило, отключены в языковых стандартах, чтобы избежать непреднамеренных ошибок. Добавление явного преобразования легко; находя какое неявное преобразование, которое вы вкладываете в свой код, не зная, что это может быть сложно.

Тип с нулевым значением и обычный тип отличаются друг от друга, чтобы избежать неявных преобразований между ними.

+1

Я думаю, вы пропустили мясо вопроса, код имеет дело с целым числом и целым числом ?, сообщаемая ошибка для логических? –

+0

"integer = integer?" приводит к «boolean?», и пользователь пытается присвоить его «логическому». Но да, я пропустил эту деталь в первую очередь :) –

0

Null имеет значение «Я не знаю, что такое значение», и по определению любая операция, в которой один из операндов имеет значение null, приводит к нулю. Например. 2 = null приводит к null и, следовательно, полученное значение от int = int? должен иметь значение null как возможное значение, а не только значения true и false. BOOL? это тип, который имеет только этот набор значений, и, следовательно, это возвращаемый тип операции.

Разрешены только косвенные отбрасывания, которые всегда будут работать. вы можете неявно использовать int в long. но не длинный для int (вы можете сделать это явно), потому что последнее может привести к потере информации. если число больше, чем int.MaxValue. В этом случае вы попытаетесь удалить ненужное значение, которое приведет к исключению во время выполнения.

Смежные вопросы