Сравнение типов-значений с null
От: Pek2014 Россия  
Дата: 02.03.17 11:43
Оценка:
Почему тип-значение 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? (в нужном мне смысле)
Re: Сравнение типов-значений с null
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 02.03.17 11:49
Оценка:
Здравствуйте, Pek2014, Вы писали:


P>Интересно могу ли я написать свой тип-значение, который будет нормально сравниваться с null? (в нужном мне смысле)


приводи к object и сравнивай на null
А вообще переопредели
public override bool Equals(object o)


и сделай перегрузку оператора
public static bool operator ==(ТвойТип a, ТвойТип b)
и солнце б утром не вставало, когда бы не было меня
Отредактировано 02.03.2017 11:52 Serginio1 . Предыдущая версия .
Re: Сравнение типов-значений с null
От: Jack128  
Дата: 02.03.17 12:04
Оценка: 2 (1) +2
Здравствуйте, Pek2014, Вы писали:

P>Почему тип-значение Guid можно сравнивать с null, а все другие типы-значения нельзя.


Всё, которые переопределили оператор сравнения можно:
        public struct B
        {
            public static bool operator ==(B point1, B point2) => false;
            public static bool operator !=(B point1, B point2) => false;
        }
Отредактировано 04.03.2017 21:56 VladD2 . Предыдущая версия .
Re[2]: Сравнение типов-значений с null
От: alexzzzz  
Дата: 02.03.17 12:12
Оценка: 27 (4) +1
Здравствуйте, 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) начинает иметь смысл.
Re[2]: Сравнение типов-значений с null
От: Pek2014 Россия  
Дата: 02.03.17 12:28
Оценка:
Здравствуйте, 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 не определяет этих операторов, и тем не менее...
Особый случай?
Re[3]: Сравнение типов-значений с null
От: Pek2014 Россия  
Дата: 02.03.17 12:39
Оценка:
Здравствуйте, 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>
public static bool operator ==(B? point1, B? point2)
A>public static bool operator !=(B? point1, B? point2)

A>А т.к. и B, и null неявно приводятся к B?, то (B == null) начинает иметь смысл.

Не мог догадаться про это "автоматически получают реализацию"...
Компилятор много чего ещё автоматически даёт? (Конструктор по умолчанию, еtc.)

Декомпиляторы кода эти "подарки" не показывают.
Нет ли какого инструмента увидеть все, что компилятор нагенерил автоматически?
Re[4]: Сравнение типов-значений с null
От: Sharov Россия  
Дата: 02.03.17 13:23
Оценка:
Здравствуйте, Pek2014, Вы писали:

P>Не мог догадаться про это "автоматически получают реализацию"...

P>Компилятор много чего ещё автоматически даёт? (Конструктор по умолчанию, еtc.)

P>Декомпиляторы кода эти "подарки" не показывают.

P>Нет ли какого инструмента увидеть все, что компилятор нагенерил автоматически?


Сейчас уже тупо можно исходники почитать -- https://referencesource.microsoft.com/
Кодом людям нужно помогать!
Re[5]: Сравнение типов-значений с null
От: Pek2014 Россия  
Дата: 02.03.17 13:30
Оценка:
Здравствуйте, Sharov, Вы писали:

P>>Нет ли какого инструмента увидеть все, что компилятор нагенерил автоматически?


S>Сейчас уже тупо можно исходники почитать -- https://referencesource.microsoft.com/


Подозреваю, что компилятор ничего такого не генерит (в буквальном смысле слова).
Генерит он IL-код, но такой "как-будто" эти "подарки" есть...
Это "подразумеваемые" подарки (подарки "в уме", подарки в уме компилятора).
Нам они не доступны и знать нам про них не надо.
Хотя иногда хочется, чтобы лучше понимать что у него на уме...
Re[4]: Сравнение типов-значений с null
От: Sinclair Россия https://github.com/evilguest/
Дата: 06.03.17 03:06
Оценка: +1
Здравствуйте, Pek2014, Вы писали:

P>Нет ли какого инструмента увидеть все, что компилятор нагенерил автоматически?

Нету. Lifted operators в виде методов не существуют. Они существуют только в воображении компилятора в момент компиляции.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.