if 语句和“?/:”运算符的区别

Difference between the if statement and "?/:" operator

我这里有这段代码。在 case ServiceType.Register: 中,我有两个看似等效的语句,一个使用常规 if 语句,另一个使用三元运算符 ?/:。对于if语句VS报错没有。然而,这一行:

IsXML == true ? PopulateRegister(ParseType.Xml) : PopulateRegister(ParseType.Str);

VS 出错说:

Only assignment, call, increment, decrement, await, and new object expressions can be used as a statement

任何人都知道为什么常规 if 语句没有错误,但是如果您使用“?/:”(一个衬里)会抛出错误?附上图片。

switch (this.ServiceType)
{
    case SerivceType.Login:
        PopulateLogin();
        break;
    case SerivceType.Register:

        if (IsXML == true)
            PopulateRegister(ParseType.Xml);
        else
            PopulateRegister(ParseType.Str);

        IsXML == true ? PopulateRegister(ParseType.Xml) : PopulateRegister(ParseType.Str);

        break;
    case SerivceType.Verify:
        PopulateVerify();
        break;
}

IsXML == true ? PopulateRegister(ParseType.Xml) : PopulateRegister(ParseType.Str);

您没有将结果分配给任何东西。

The conditional operator (?:) returns one of two values depending on the value of a Boolean expression. Following is the syntax for the conditional operator. [Emphasis mine]

https://msdn.microsoft.com/en-us/library/ty67wk28.aspx

没有什么可以 return 因为你的函数是 return 类型的 void。

条件运算符是为变量赋值的快捷方式。但是你的方法 PopulateRegister 没有 return 一个值(void)。因此,请改用 if-else

if 是一个 语句 ?: 是一个三元 运算符 ,用于 表达式。它的操作数 必须 是产生值的表达式。您的方法 PopulateRegister 没有 return 值,因此它不会起作用。

您不能提供任意表达式来代替语句,因此您认为的快捷方式将行不通。以下不是有效的陈述:

// this is an expression, not a statement
IsXML == true ? PopulateRegister(ParseType.Xml) : PopulateRegister(ParseType.Str);

这将是有效的:

// this is a valid statement
PopulateRegister(IsXML ? ParseType.Xml : ParseType.Str);

旁注:

  • 不要使用 IsXML == trueIsXML 本身是一个布尔表达式,因此与 true 的相等比较完全是多余的,只会使您的代码混乱。
  • 您观察到的错误是编译时的。因此它不是由代码本身抛出,它是由编译器报告的。

?: 运算符用于条件赋值,而不是操作。

声明:

IsXML == true ? PopulateRegister(ParseType.Xml) : PopulateRegister(ParseType.Str);

如果方法 PopulateRegister return 是一个值,并且您将该值分配给某物,则

将有效。例如,这将是有效的:

string result = (someCondition) ? "condition is true" : "condition is false";

您可能希望以这种方式使用条件(请注意,我们使用 ParseType 枚举值作为条件的 return 类型,并且它充当您的参数方法):

PopulateRegister((IsXML) ? ParseType.Xml : ParseType.Str);

请注意,以上是可行的,但会产生难以 understand/debug/maintain 的代码,通常不会被视为最佳实践。

将块:(b) ? (c) : (d) 视为一个独立的对象 value。这样 b 是布尔值。 cd 继承自 object

错误的原因是 if..then..else 是一个语句,这意味着它应该不是 return 一个值,把它想象成某种无效函数(不是真的所以,但我希望你明白了)而 ? : 运算符是一个表达式,这意味着它 return 是一个值,并且由于你使用的函数是 void 所以 return。希望这有帮助