三元运算符在使用反射时失败

时间:2010-12-09 20:56:11

标签: c# reflection

这有效:

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 个答案:

答案 0 :(得分:4)

这里的反思是红鲱鱼。在C#中,并非所有表达式都作为独立语句有效。例如:

a + b;

不会编译。

同样,根据C#语法,? :不是有效的表达式 - 语句构造。你总是要对三元表达式的值做些什么。如果您不关心该值,则应使用if语句。

  

Relevant Portion of C# Grammar

     

表达式语句

     
    

statement-expression ;

  
     

statement-expression

     
    

调用表达式
    对象创建表达式
    分配
    后增量表达
    后递减表达
    预增量表达
     pre-decrement-expression

  

答案 1 :(得分:1)

三元运算符期望返回一个值。我猜,你打电话的方法不是。 :)

来自MSDN remarks

  

条件必须评估为真或   假。如果条件为真,   first_expression被评估和   成为结果。如果条件是   false,second_expression被评估   并成为结果。只有一个   评估两个表达式。

     

first_expression的类型   和second_expression必须是   相同,或隐式转换必须   从一种类型存在到另一种类型。

如果执行语句没有涉及类型(void除外),则三元运算符在这种情况下不起作用。

答案 2 :(得分:0)

这是因为你没有从条款中返回任何内容。当将结果值分配给某个变量或返回时,三元运算符将特别用作if / else。