Это интересный вопрос ... он работает, например, с Decimal
, но не с TimeSpan
, которые оба являются правильными типами .NET (в отличие от float
и т. Д., Которые являются примитивами), и оба имеют оператор + , Любопытно!
Конечно, вы можете повернуть руку с помощью:
Money m3 = (Money)m1 + (Money)m2;
И если вы просто используете Nullable<T>
, это, конечно, будет работать бесплатно - плюс вы получите поддержку компилятора + среды выполнения (бокса). Есть ли причина не использовать Nullable<T>
здесь?
Я посмотрю на спецификации; тем временем вы можете подумать о повышении оператора до MyNullable<T>
; при обычном Nullable<T>
компилятор C # предоставляет «поднятые» операторы для операторов, поддерживаемых типом, но вы не можете сделать это самостоятельно. Лучшее, что вы можете сделать, это предложить все очевидные из них и надеяться, что тип поддерживает его ;-p Чтобы получить доступ к операторам с обобщениями, см. здесь , доступно для бесплатной загрузки здесь .
Обратите внимание, что вы, вероятно, захотите применить соответствующие "отмененные" чеки - т.е.
x + y => (x.HasValue && y.HasValue)
? new MyNullable<T>(x.Value + y.Value)
: new MyNullable<T>();
Обновление
Различная обработка, по-видимому, относится к 14.7.4 (ECMA 334 v4) «Оператор сложения», где он предопределен для диапазона типов , включая десятичный (так что это был плохой тест me), поскольку согласно 14.2.4 (то же самое) «Разрешение перегрузки бинарных операторов», предопределенные операторы получают особое упоминание. Я не утверждаю, что понимаю это полностью.