2016-01-22 2 views
2

Давайте посмотрим следующий код:противоречащий дизайн сложения/вычитания между числами и числами обнуляемого

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 проще в использовании, чем текущий дизайн. Вероятно, это вопрос, основанный на основном вопросе.

+6

Потому что 'null' is * not *' 0'. – Rob

+0

Поиск «Возможно, монада» - это будет отражать другое * мнение * о проблеме. Неверное поведение в распространении проще объяснить и хорошо сочетается с поведением NaN для чисел с плавающей точкой - https://msdn.microsoft.com/en-us/library/system.single.nan.aspx –

+0

@Rob Но это не причина «1 + null == null» –

ответ

0

Если 1 + null == 1, то необходимо учитывать следующее:

int a = 1; 
int? b = null; 
int result = a + b; 
int difference = (a + b) - a; 

bool zeroEqualsNull = (difference == b); 

result бы int, не int? как мы знаем int + null == int

Очевидно, что difference может быть переоформлена просто b. Затем мы сравниваем b == b, что должно дать true.

b является null, а не 0.А если 0 == null мы бы в ужасной ситуации. Почему вообще можно использовать int??

Если, конечно, не difference оказался int? - что означает либо добавление или вычитание операция должна, в некоторых случаях, возвращение null.

P.S. Указывать на javascript как ссылку на то, как должен вести себя язык, - плохая идея;)

+0

Ошибка: 'result' и' difference' имеет тип 'int?'. А между тем '(a + b) -a' будет' 0 + b', это выражение 'int + int? ', Если команда компилятора использует мой ожидаемый дизайн,' a int plus null int? равна исходному int', '0 + b == 0' преуспевает. Итак, как я уже сказал, здесь нет проблемы с математикой. –

+0

И, кстати, '0 + b' - это тип' int? ', Поэтому вы не можете игнорировать часть '0 +' и говорить 'b == 0', потому что это правило применяется только к вычислениям int. –

+0

@ DannyChen Почему 'result' и' difference' '' int? '' '' '' '' '' '. Если '1 + null = 1', и это * определенный * результат, то нет никакой причины, что' int + int? = int? '. На самом деле это был один из моих основных моментов. Я не сравнивал '0 + b == 0', он сравнивает' 0 == b' – Rob

0

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

Сначала вы должны знать, что null - это не то же самое, что и 0. null средства в буквальном переводе НИЧТО. Там абсолютно ничего нет! 0, с другой стороны, ЧТО-ТО. Он имеет значение, и это значение равно 0!

Мы все знаем, что 1 + 0 = 1, но что такое 1 + ничего? Вы можете увидеть работы, как это:

1 + 

Там нет ничего на другой стороне +! И компьютер не может делать добавления только с одним операндом! Таким образом, он возвращает null.

+0

Я думаю, что имеет смысл: когда я ничего не добавляю к 1, ничего не добавляется к 1, поэтому я получаю оригинальную вещь, то есть 1. –

+0

@ DannyChen Вы не понимаете. Существует разница между 0 и ничем. Высказывание «1 + null» не является таким же концептуальным, как «добавление ничего в 1». Вы могли бы также попытаться сделать «1 + красный». – Abion47

1

Недостаток в вашей логике заключается в том, что null - это не то же самое, что 0. 0 - значение, тогда как null по определению означает отсутствие значения. Как вы добавляете значение и отсутствие значения?

Подумайте об этом. У меня есть один мрамор в одной руке и без мрамора в другой руке. Тогда я могу сказать, что у меня есть мрамор или мрамор.

Тогда скажите, что у меня был один мрамор в одной руке, а с другой стороны у меня была коробка с непознаваемым количеством мраморов в ней. У меня было бы 1 + ? мрамора. Итак, сколько у меня мрамора?

Пытается добавить значение и null вместе пытается применить арифметику к двум совершенно другим понятиям. Нет объективного способа сказать, какая ценность будет выходить из операции, поэтому самый простой способ справиться с этим - сказать, что нет никакой ценности, a.k.a null.

EDIT: В ответ на ваш вопрос о строках, строки причин действуют по-другому, потому что сами строки полностью отличаются от целых чисел. 1 + null не имеет смысла, но "1" + null - это то же самое, что сказать, что вы объединяете массив с пустым массивом, поэтому имеет смысл, что вы получаете тот же массив, с которого вы начали.

0

Его легко спорить и утверждать, что счетчик

1 + 0 = 1 + ничего = 1

Но наш анализ эвристического. Мы также принимаем контекстуальный смысл. Для компьютера, который, кстати, работает только с 0 и 1 (двоичный, то есть), был разработан для обработки 0 как целого числа, которое имеет значение. С другой стороны, NULL можно использовать для всего, что не имеет значения. поэтому он используется в строках, int, float, char везде, но представляет переменную, которая не имеет никакого значения.

Не нужно было усложнять ситуацию, добавляя сценарии, которые редко случаются.

Теперь способ добавления в наших системах состоит из двух значений. Место, где у нас ничего нет, или Null не закодировано для возврата и другое значение. Но если вы переопределите оператор +, чтобы принять во внимание ничего (null), вы можете достичь того, что ищете.

Надеюсь, это объяснит ваш вопрос.

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