Сообщение 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) или использовать дженерик-метод:
то компилятор сможет вывести типы и все будет пучком.
По уму компилятору нужно бы давать предупреждение о том, что default подставляется в место где требуется object и что лучше явно задать null.
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) или использовать дженерик-метод:
то компилятор сможет вывести типы и все будет пучком.
По уму компилятору нужно бы давать предупреждение о том, что default подставляется в место где требуется object и что лучше явно задать null.
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.