Типы Nullable и тернарный оператор: почему'? 10: пустой указатель', запрещенный? [дубликат]

Я хочу поместить значения из переменной "Company" в EditCoForm и в поля ввода текста HTML.

blockquote>

При создании группы форм необходимо указать эти значения (из company):

// suppose company is
company = {
  coid: 'coid',
  coname: 'coname'
}

this.EditCoForm = this.formBuilder.group({
  coid: [this.company.coid, [Validators.required]],
  coname: [this.company.coname, [Validators.required]],
  ...

Затем оба элемента управления формы с соответствующими именами и входными значениями (в шаблоне HTML) будет иметь значения из company:


...

Или, если это невозможно сделать при создании группы форм, вы также можете установить значения для группы форм следующим образом:

this.EditCoForm.setValue({
  coid: this.company.coid,
  coname: this.company.coname,
  ...

});
[1110 ] Вот стекаблиц

242
задан abatishchev 19 April 2013 в 21:19
поделиться

8 ответов

The compiler first tries to evaluate the right-hand expression:

GetBoolValue() ? 10 : null

The 10 is an int literal (not int?) and null is, well, null. There's no implicit conversion between those two hence the error message.

If you change the right-hand expression to one of the following then it compiles because there is an implicit conversion between int? and null (#1) and between int and int? (#2, #3).

GetBoolValue() ? (int?)10 : null    // #1
GetBoolValue() ? 10 : (int?)null    // #2
GetBoolValue() ? 10 : default(int?) // #3
396
ответ дан 23 November 2019 в 03:12
поделиться

Попробуйте следующее:

int? x = GetBoolValue() ? 10 : (int?)null;

По сути, происходит то, что условный оператор не может определить "тип возврата" выражения. Поскольку компилятор неявно решает, что 10 является int , он решает, что возвращаемый тип этого выражения также должен быть int . Поскольку int не может быть нулевым (третий операнд условного оператора), он жалуется.

Приведением null к Nullable < int> мы явно сообщаем компилятору, что возвращаемый тип этого выражения должен быть Nullable . С таким же успехом вы могли бы преобразовать 10 в int? и получить тот же эффект.

34
ответ дан 23 November 2019 в 03:12
поделиться

Между прочим, реализация компилятора C # от Microsoft фактически получает анализ типов условный оператор неверен в очень тонкой и интересной (для меня) форме. Моя статья об этом Проблемы с выводом типов, часть первая .

14
ответ дан 23 November 2019 в 03:12
поделиться
int? x = GetBoolValue() ? 10 : (int?)null;

Причина, по которой вы это видите, заключается в том, что за кулисами вы используете Nullable и вам нужно сообщить C #, что ваш «null» является пустым экземпляром Nullable.

4
ответ дан 23 November 2019 в 03:12
поделиться

Попробуйте одно из следующих:

int? x = GetBoolValue() ? (int?)10 : null;

int? x = GetBoolValue() ? 10 : (int?)null;
5
ответ дан 23 November 2019 в 03:12
поделиться

Проблема в том, что тернарный оператор выводит тип на основе вашего первого присвоения параметра ... 10 в данном случае, которое является int, а не обнуляемым int.

У вас может быть удачи с:

int? x = GetBoolValue() (int?)10 : null;
5
ответ дан 23 November 2019 в 03:12
поделиться

Просто добавьте явное приведение.

int? x = GetBoolValue() ? 10 : (int?)null;

Это тернарный оператор, который сбивает с толку - второй аргумент является целым числом, и поэтому третий аргумент также должен быть целым числом, и null не подходит.

4
ответ дан 23 November 2019 в 03:12
поделиться

Это потому, что компилятор определяет тип условного оператора по второму и третьему операндам, а не по тому, чему вы присваиваете результат. Между целым числом и нулевой ссылкой, которое компилятор может использовать для определения типа, нет прямого приведения.

4
ответ дан 23 November 2019 в 03:12
поделиться
Другие вопросы по тегам:

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