Информация об изменениях

Сообщение Re[3]: Минутка WTF-20: Меньше кода - меньше ошибок от 08.11.2017 23:56

Изменено 08.11.2017 23:58 VladD2

Re[3]: Минутка WTF-20: Меньше кода - меньше ошибок
Здравствуйте, 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(T));

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

По уму компилятору нужно бы давать предупреждение о том, что default подставляется в место где требуется object и что лучше явно задать null.
Re[3]: Минутка WTF-20: Меньше кода - меньше ошибок
Здравствуйте, 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.