Это оператор ==
.
Класс TimeSpan
перегружен оператором равенства:
public static bool operator ==(DateTime d1, DateTime d2)
{
return (t1._ticks == t2._ticks);
}
Само по себе это не позволяет сравнивать с null
, , но ...
С появлением обнуляемых типов каждая структура неявно преобразуется в обнуляемый тип , поэтому, когда вы видите что-то вроде
TimeSpan y = new TimeSpan();
if (y == null)
return;
Вы не видите , что это происходит:
TimeSpan y = new TimeSpan();
if ((Nullable<TimeSpan>)y == (Nullable<TimeSpan>)null)
return;
Null получает неявное преобразование (неявное присвоение?), Но не все System.Object
объекты do:
TimeSpan y = new TimeSpan();
object o = null;
if (y == o) //compiler error
return;
Хорошо, но оператор равенства не принимает нулевые аргументы, не так ли?
Ну, msdn здесь поможет, заявив:
Предопределенные унарные и двоичные
операторы и любые пользовательские
операторы, которые существуют для типов значений
также могут быть использованы обнуляемыми типами.
Эти операторы выдают нулевое значение
если [любой из] операндов нулевой; иначе,
оператор использует содержащееся значение
рассчитать результат.
Таким образом, вы фактически получаете реализацию с нулевым значением для каждого оператора бесплатно с фиксированным определенным поведением. Упомянутое выше «содержащееся значение» является фактическим значением, которое должен возвращать необнуляемый оператор.