Гуид == пустой указатель не должен быть позволен компилятором

Поведение, описанное ниже, характерно для .net 3.5 только

Я просто натыкался на самое удивительное поведение в компиляторе C#;

У меня есть следующий код:

Guid g1 = Guid.Empty;
bool b1= (g1 == null);

Ну, Гуид не nullable поэтому, это никогда не может быть равно пустому указателю. Сравнение, которое я делаю в строке 2 всегда, возвращает false.

При создании того же самого для целого числа компилятор выдает предупреждение, говоря, что результатом всегда будет ложь:

int x=0;
bool b2= (x==null);

Мой вопрос: То, почему делает компилятор, позволяет Вам сравнить Гуид с пустым указателем?
Согласно моему знанию, это уже знает, что результатом всегда является ложь.
Встроенное преобразование сделано таким способом, которым компилятор действительно предполагает, что пустой указатель является возможным значением?
Я пропускаю что-нибудь здесь?

46
задан Cœur 10 July 2018 в 13:10
поделиться

2 ответа

Марка верна. Типы ценностей, которые определяют свои собственные операторы равенства, автоматически снимаются донутыми версиями, определенными также, бесплатно. Нужный оператор равенства, который принимает два изнурительных руководства, применим в этой ситуации, будет вызываться, и всегда будет возвращать ложь.

В C # 2 это произвело предупреждение, но по какой-то причине это прекратило производить предупреждение для GUID-NULL, но продолжает давать предупреждение для INT-NULL. Я не знаю почему; У меня еще не было времени расследовать.

Я прошу прощения за ошибку; Я, вероятно, прикрутил один из путей кода предупреждения, при переписывании оттудавающейся логики в C # 3. Добавление деревьев выражения на языке основным изменившимся порядок, в котором реализуются нумерые арифметические операции; Я сделал многочисленные ошибки, перемещающие этот код вокруг. Это какой-то сложный код.

81
ответ дан 26 November 2019 в 20:22
поделиться

Я думаю, что это зависит от того, что вы пытаетесь достичь. Если вы предоставляете метод, который добавляет любые две точки вместе, вам нужен статический метод. Но если вы хотите метод, который добавляет точку на данный момент точки, вы хотите нестатический метод.

Если вы используете статические методы, то вы можете рассмотреть возможность установки статических методов в отдельный класс утилиты (PointCalculator), который содержит только статические методы. Это похоже на математический класс.

-121--3311464-

Сравнение действительна, поскольку компилятор преобразует GUID к Nullable , а затем имеет смысл.

Существует отчет об ошибках о предупреждении, не выдаваемых здесь .

См. здесь здесь для более полного объяснения от Eric Lippert.

13
ответ дан 26 November 2019 в 20:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: