Почему тип-значение Guid можно сравнивать с null, а все другие типы-значения нельзя.
public struct B
{
}
...
var b = new B();
if (b == null) // CS0019 Operator '==' cannot be applied to operands of type 'B' and '<null>'
Console.WriteLine("!!!");
var g = new Guid();
if (g == null) // OK
Console.WriteLine("OK");
Понятно, почему все другие нельзя. Не понятно, почему вдруг Guid можно.
Кстати, Nullable<> типы это тоже значения и тем не менее их можно сравнивать с null (что естественно, тут особый случай).
Интересно могу ли я написать свой тип-значение, который будет нормально сравниваться с null? (в нужном мне смысле)
Здравствуйте, Jack128, Вы писали:
J>Всё, которые переопределили оператор сравнения можно: J> public struct B J> { J> public static bool operator ==(B point1, B point2) => false; J> public static bool operator !=(B point1, B point2) => false; J> }
... потому что автоматически получают реализацию по умолчанию для
public static bool operator ==(B? point1, B? point2)
public static bool operator !=(B? point1, B? point2)
А т.к. и B, и null неявно приводятся к B?, то (B == null) начинает иметь смысл.
Здравствуйте, Jack128, Вы писали:
J>Всё, которые переопределили оператор сравнения можно: J> public struct B J> { J> public static bool operator ==(B point1, B point2) => false; J> public static bool operator !=(B point1, B point2) => false; J> }
Nullable не определяет этих операторов, и тем не менее...
Особый случай?
Здравствуйте, alexzzzz, Вы писали:
A>Здравствуйте, Jack128, Вы писали:
J>>Всё, которые переопределили оператор сравнения можно: J>> public struct B J>> { J>> public static bool operator ==(B point1, B point2) => false; J>> public static bool operator !=(B point1, B point2) => false; J>> }
A>... потому что автоматически получают реализацию по умолчанию для A>
Здравствуйте, Pek2014, Вы писали:
P>Не мог догадаться про это "автоматически получают реализацию"... P>Компилятор много чего ещё автоматически даёт? (Конструктор по умолчанию, еtc.)
P>Декомпиляторы кода эти "подарки" не показывают. P>Нет ли какого инструмента увидеть все, что компилятор нагенерил автоматически?
Здравствуйте, Sharov, Вы писали:
P>>Нет ли какого инструмента увидеть все, что компилятор нагенерил автоматически?
S>Сейчас уже тупо можно исходники почитать -- https://referencesource.microsoft.com/
Подозреваю, что компилятор ничего такого не генерит (в буквальном смысле слова).
Генерит он IL-код, но такой "как-будто" эти "подарки" есть...
Это "подразумеваемые" подарки (подарки "в уме", подарки в уме компилятора).
Нам они не доступны и знать нам про них не надо.
Хотя иногда хочется, чтобы лучше понимать что у него на уме...
Здравствуйте, Pek2014, Вы писали:
P>Нет ли какого инструмента увидеть все, что компилятор нагенерил автоматически?
Нету. Lifted operators в виде методов не существуют. Они существуют только в воображении компилятора в момент компиляции.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.