Давайте посмотрим следующий код:противоречащий дизайн сложения/вычитания между числами и числами обнуляемого
int a = 1;
int? b = null;
var addition = a + b;
var subtraction = a - b;
Я ожидаю, как addition
и subtraction
является 1
. Но на самом деле оба из них: null
. Сгенерированный код без синтаксических сахаров, как это:
int? addition = b.HasValue ? new int?(a + b.GetValueOrDefault()) : new int?();
С точки зрения VB.NET это более противоречит здравому смыслу: Автошоу результат 1 + Nothing
является Nothing
.
Я думаю, что они могли бы сделать добавление в этом случае легко:
int addition = a + b.GetValueOrDefault();
//or int? addition = a + b.GetValueOrDefault();
Но, честно говоря, нынешний дизайн не нарушает its associativity. Мой вопрос: почему они так проектируют оператора? Каков недостаток моего ожидаемого поведения?
EDIT Несколько замечаний отметил, что «из-за null
не 0
», это абсолютно правильно. Но это не из-за того, что 1+null==null
, я не сказал null
is 0
. Почему не может 1+null==1
? Обратите внимание, что: даже 1+null==1
и 1+0==1
, мы не можем сделать вывод null==0
. Если да, 1+null==null
и 2+null==null
, я могу также сделать вывод 1==2
, что не имеет смысла. Правила работы на null
определяются командой компилятора, почему они выбирают это правило, отличное от добавления значения null к int и string.
EDIT рассматривать null
как «я понятия не имею», то как вы объясните, что добавление null
в строку «1» дает оригинальный «1» вместо null
(я понятия не имею)? Помните, null
не string.Empty
!
EDIT Я считаю, что нет математики проблемы здесь, потому что в некоторых языках 1 + null
возвращает 1
(попробуйте JavaScript). Так что это всего лишь (возможно, личный) выбор, разработчик (ы) языка. IMO 1 + null == 1
проще в использовании, чем текущий дизайн. Вероятно, это вопрос, основанный на основном вопросе.
Потому что 'null' is * not *' 0'. – Rob
Поиск «Возможно, монада» - это будет отражать другое * мнение * о проблеме. Неверное поведение в распространении проще объяснить и хорошо сочетается с поведением NaN для чисел с плавающей точкой - https://msdn.microsoft.com/en-us/library/system.single.nan.aspx –
@Rob Но это не причина «1 + null == null» –