Re[3]: Минутка WTF-20: Меньше кода - меньше ошибок
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.11.17 23:56
Оценка: 56 (2) +1
Здравствуйте, vasmann, Вы писали:

V>Нет, не боксинг. То как компилируются шаблонные типа/методы.

V>Если нет ограничения (where), то компилируется всё, как для object типа. Поскольку компилятор не может делать предположений о том, какие типы будут передаваться в runtime

where тут не причем. Для T без проблем можно правильно сформировать дефолтное значение. Тут проблема в Equals. Она не обобщенная, а принимает два object. Соответственно компилятор не может вывести тип для default и подставляет null (для object). Ну, а Equals считает 0 и null разными значениями (не С++ все же).

Если задать тип явно default(T) или использовать дженерик-метод:
static bool IsDefault<T>(T value) => EqualityComparer<T>.Default.Equals(value, default);

то компилятор сможет вывести типы и все будет пучком.

По уму компилятору нужно бы давать предупреждение о том, что default подставляется в место где требуется object и что лучше явно задать null.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Отредактировано 08.11.2017 23:58 VladD2 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.