Я только что посмотрел на этот ответ , который содержит код для Nullable<T>
из .NET Reflector, и заметил две вещи:
- Требуется явное преобразованиепри переходе от
Nullable<T>
к T
. - Оператор
==
не определен.
Учитывая эти два факта, меня удивляет, что это компилируется:
int? value = 10;
Assert.IsTrue(value == 10);
С кодом value == 10
либо value
магическим образом преобразуется в int
(следовательно, допускается использование оператора int
==
или оператор ==
магически определено для Nullable<int>
. (Или, я полагаю, менее вероятно, Reflector пропускает часть кода.)
Я ожидал бы выполнить одно из следующих действий:
Assert.IsTrue((value.Equals(10)); // works because Equals *is* defined
Assert.IsTrue(value.Value == 10); // works because == is defined for int
Assert.IsTrue((int?)value == 10); // works because of the explicit conversion
Это, конечно, работает, но ==
также работает, и это часть, которую я не понимаю.
Причина, по которой я это заметил и задаю этот вопрос, заключается в том, что я пытаюсь написать структуруэто работает примерно так же, как Nullable<T>
. Я начал с кода Reflector, связанного выше, и только что сделал сомОчень незначительные модификации.К сожалению, мой CustomNullable<T>
не работает так же.Я не могу сделать Assert.IsTrue(value == 10)
.Я получаю «Оператор ==
не может быть применен к операндам типа CustomNullable<int>
и int
».
Теперь, независимо от того, насколько незначительна модификация, я не ожидал, что смогу сделать ...
CustomNullable<T> value = null;
... потому что я понимаю, что за Nullable<T>
стоит какая-то магия компилятора, позволяющая устанавливать значения на null
, хотя Nullable<T>
является структурой, но я хотел бы ожидайте, что я смогу имитировать все другие варианты поведения Nullable<T>
, если мой код написан (почти) одинаково.
Может ли кто-нибудь пролить свет на то, как работают различные операторы Nullable<T>
, когда ониПохоже, не будет определено?