Тернарный оператор не работает при использовании отражения - PullRequest
0 голосов
/ 09 декабря 2010

Это работает:

int valueAsInt = 0;

if (Int32.TryParse(value, out valueAsInt))
{
    record.GetType().GetProperty(property).SetValue(record, valueAsInt, null);
}
else
{
    record.GetType().GetProperty(property).SetValue(record, value, null);
}

Это, однако, не.Не знаю, почему.

Int32.TryParse(value, out valueAsInt) ? record.GetType().GetProperty(property).SetValue(record, valueAsInt, null) :record.GetType().GetProperty(property).SetValue(record, value, null);

Я получаю следующие сообщения об ошибках:

Ошибка 1 В качестве оператора могут использоваться только выражения присваивания, вызова, приращения, уменьшения и новых выражений объектов

Ошибка 2 Тип условного выражения не может быть определен, потому что не существует неявного преобразования между 'void' и 'void'

Мне просто было любопытно, почему троичный оператор не срабатывает в этом сценарии.Спасибо!

Ответы [ 3 ]

4 голосов
/ 10 декабря 2010

Отражение здесь - красная сельдь. В C # не все выражения допустимы как независимые операторы. Например:

a + b;

не скомпилируется.

Аналогично, ? : не является допустимой выражением-выражением согласно грамматике C #. Вы всегда должны что-то делать со значением троичного выражения. Если вас не волнует значение, вы должны использовать оператор if.

Соответствующая часть грамматики C # :

выражение-выражение :

выражение-выражение ;

выражение-выражение :

призывание выражение
объект-создание-выражение
Назначение
пост-инкремент выражение
постдекремент выражение
Преинкремент выражение
выражение перед декрементом

1 голос
/ 10 декабря 2010

Тернарный оператор ожидает возврата значения.Методы, которые вы вызываете, я думаю, нет.:)

Из замечаний MSDN :

Условие должно оцениваться как истинное или ложное.Если условие истинно, first_expression оценивается и становится результатом.Если условие ложно, second_expression оценивается и становится результатом.Оценивается только одно из двух выражений.

Либо тип first_expression и second_expression должен совпадать, либо должно существовать неявное преобразование из одного типа в другой.

Еслинет никаких типов, вовлеченных в выполнение ваших операторов (кроме void), троичный оператор не будет работать в этой ситуации.

0 голосов
/ 10 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...