【问题标题】:Ternary operator failing when using reflection使用反射时三元运算符失败
【发布时间】:2011-05-23 03:04:46
【问题描述】:

这行得通:

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 只有赋值、调用、递增、递减和new对象表达式可以作为语句使用

错误 2 无法确定条件表达式的类型,因为 'void' 和 'void' 之间没有隐式转换

我只是好奇为什么三元运算符在这种情况下会失败。谢谢!

【问题讨论】:

标签: c# reflection


【解决方案1】:

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

a + b;

不会编译。

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

Relevant Portion of C# Grammar:

表达式语句

语句表达式 ;

语句表达式

调用表达式
对象创建表达式
赋值
后增量表达式
后减表达式
前增表达式
减前表达式

【讨论】:

    【解决方案2】:

    三元运算符期望返回一个值。我猜你调用的方法不会。 :)

    来自MSDN remarks

    条件必须评估为真或 错误的。如果条件为真, first_expression 被评估并且 变成结果。如果条件是 假,second_expression 被评估 并成为结果。只有其中之一 对这两个表达式求值。

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

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

    【讨论】:

      【解决方案3】:

      这是因为您没有从子句返回任何内容。当结果值被分配给某个变量或返回时,三元运算符专门用作 if/else。

      【讨论】:

        猜你喜欢
        • 2021-03-22
        • 2019-11-05
        • 2018-10-31
        • 2013-12-04
        • 2023-04-08
        • 1970-01-01
        • 2011-04-19
        • 2018-04-11
        • 2018-01-26
        相关资源
        最近更新 更多