действительно прикольное поведение компилятора C # с обнуляемыми литералами - PullRequest
1 голос
/ 21 сентября 2010

Компилятор C # 4.0 не жалуется на это (даже не предупреждение):

if(10.0 > null + 1)
{       
}

if (myDoubleValue > null)
{
}

И, похоже, всегда ложно.Что здесь происходит?Ноль автоматически преобразуется в Nullable<double> или что-то в этом роде?

Если так, почему это не работает, то:

double myDoubleValue = null + 1;

Кроме того, зачем мне вообще такое поведение.Почему хорошо, что с такими литералами можно поиграть?

Ответы [ 2 ]

8 голосов
/ 21 сентября 2010

Причина, по которой назначение не работает, заключается в том, что результат имеет тип double?, а не double. Результатом всегда будет нулевое значение для типа double? (он же Nullable<double>).

О, и оба первых двух блока должны вызвать компиляцию с такими предупреждениями:

Test.cs (7,19): предупреждение CS0458: результат выражения всегда 'null' типа 'int?'
Test.cs (12,13): предупреждение CS0464: сравнение с нулем типа "двойной?" всегда выдает «ложь»

Управление компиляцией без ошибок - это не то же самое, что не жаловаться:)

2 голосов
/ 21 сентября 2010
if(10.0 > null + 1)
{

}

фактически эквивалентно:

int? i = null + 1; // i.HasValue = false in this case
if(10.0 > i)
{

}

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

double myDoubleValue = null + 1;

не компилируется, потому что тип справа int?, а не double.

Также этот вопрос просто из любопытства при попытке #% = ^ компилятору, или вы на самом деле пишетечто-то подобное в реальном проекте?

...