Чому не возразить null викликати попередження компілятора

У тому випадку, коли тип посилання об'єднується з нульовим, чому це не попередження компілятора в компіляторі C #? Чи є якісь випадки, коли це має сенс?

obj2 = obj ?? null;
3

6 Відповіді

Ви повинні прочитати мій твір на цю тему

Коротко: щоб попередження компілятора існувало, воно повинно бути:

  1. Думка
  2. Дешево реалізувати
  3. Практично завжди неправильно
  4. Допустимий набір випадково
  5. Виправлено
  6. рідкісні
  7. Тільки може бути виконаний компілятором
  8. Не очевидно під час тестування

Ваше запропоноване попередження не відповідає вимогам 1 і 4. Ви, на мій погляд, перша людина, щоб подумати про це, і тому це не може бути попередженням, оскільки ніхто в команді компілятора не думав про це. І це навряд чи буде набиратися випадково, так чому це повинно бути попередження? Попередження є в тому, щоб повідомити вам, коли ви помиляєтесь з тим, що імовірно є помилковим. Також не виконується вимога 3, оскільки код не очевидно неправильний , це просто необдумано складне . Компілятор не дає попереджень для x * 1 , де x також є цілим числом.

11
додано

Це робить сенс , але це просто не дуже корисно.

Не існує:

i = i + 0;

Але компілятор теж не скаржиться. Чому це? Компілятор робить те, що сказано, доки ваш запит синтаксично правильний - який він є.

7
додано
Чи буде ця лінія вилучатися під час оптимізації?
додано Автор Travis J, джерело
@Travis цікаве питання - я не знаю, але це не помилка
додано Автор Marc Gravell, джерело
@ Chris Kudos за увагу до деталей - більше, ніж я міг би розтягнутися на вечір п'ятниці
додано Автор Marc Gravell, джерело
Так, компілятор C# оптимізує додавання постійного нуля до цілих чисел. Це також оптимізує множення на постійне.
додано Автор Eric Lippert, джерело
Швидкий тест в LINQPad виглядає так, як це оптимізує додавання, якщо I є int . (IL для i = i; виглядає ідентичним як i = i + 0 ). Це, безумовно, досить розумно, щоб не оптимізувати його, якщо i індивідуальний тип з неявним перевантаженням оператора + для int. EDIT: він, як видається, зберігає додавання, якщо i - це float або подвійний (але не decimal )
додано Автор Chris Sinclair, джерело

Ваш приклад не зовсім має сенс, але робить щось подібне;

d = a ?? b ?? c ?? null;

Тут я кажу, що беру перше не нульове значення трьох, якщо вони всі нульові, то просто візьміть нуль.

2
додано
Що буде відмінність до d = a ?? б ?? c; ?
додано Автор Daniel Fischer, джерело
Ось і висновок, що я також прийшов, це більш чітко.
додано Автор Daniel Fischer, джерело
@DanielFischer функціонально це нічим не відрізняється. Я думаю, що намір більше зрозумілий читачеві, особливо якщо вони не дуже добре знайомі з оператором нульових коалісів.
додано Автор evanmcdonnal, джерело

Хоча ця заява не дуже корисна, чому б це попередив вас?

Якщо obj не є нульовим, obj2 присвоюється obj . Або obj2 присвоюється null . Це абсолютно законно.

1
додано

Як

Ми намагаємося резервувати попередження лише в тих ситуаціях, коли ми можемо майже з упевненістю сказати, що код розбитий, вводить в оману або даремний

Тому для коду використовуються попередження, які, будучи синтаксично правильними, можуть призвести до реальних проблем.

1
додано
Ви не думаєте, що це марно? Це є. І це не оптимізовано.
додано Автор eduesing, джерело

Ви можете писати багато речей, які не мають сенсу, компілятор не повинен вказати кожен з них як попередження.

1
додано
var chat = new Chat();
var chat = new Chat();
642 учасників

Обсуждение вопросов по C# / .NET / .NET Core / .NET Standard / Azure Сообщества-организаторы: — @itkpi — @dncuug