?没有其他部分的操作员

Joh*_*son 16 c# theory conditional-operator

我用C#?运算符,当我有if语句影响一行,这一切都很好.但是让我说我​​有这个代码(使用经典的if语句):

if(someStatement)
{
    someBool = true;  //someBools value is unknown
}
else
{
    //Do nothing
}
Run Code Online (Sandbox Code Playgroud)

这可以通过以下方式在单线上实现:

someBool = (someStatement) ? true : someBool;
Run Code Online (Sandbox Code Playgroud)

但为什么我不能这样做:

someBool = (someStatement) ? true : ;
//or possibly
someBool = (someStatement) ? true;
Run Code Online (Sandbox Code Playgroud)

这有可能吗?如果是,使用一种方法比另一种方法有什么好处吗?如果没有,为什么你不能这样做?

Wee*_*ble 17

你可以做:

someBool = (someStatement) ? true : someBool;
Run Code Online (Sandbox Code Playgroud)

我不认为这会让你更清楚:

if (someStatement)
{
    someBool = true;
}
Run Code Online (Sandbox Code Playgroud)

但这似乎是一个品味问题.我不会说两者都显然不好,但前者并不常见,所以我可能会避免它.


你问为什么你不能像这样使用运算符:

someBool = (someStatement) ? true : ;
Run Code Online (Sandbox Code Playgroud)

这将是一个非常大的语言变化!请记住,赋值看起来像这样:

<location> = <expression>;
Run Code Online (Sandbox Code Playgroud)

计算表达式以给出一些值,并将该值存储在位置中.(根据位置是变量,属性,字段还是索引表达式,"存储"操作可能会有很大不同.)

在这里,你提出右边的表达式的值,除了它的正常值,可以是一个"无变化"值,它具有特殊的行为,当你在赋值语句中使用它时,它不会导致存储操作发生.这与任何其他正常值不同,并且可能令人惊讶.但是如果你在其他地方使用它会是什么意思?

// Does this call DoSomething when cond is false?
// If so, what value is passed to it?
someObject.DoSomething(cond?x:);

// What happens here if cond is false? Does it cancel
// the entire assignment?
int x = 77 + (cond?2:) * 3 - 4;

// If cond is false, are methods F1 and F2 called or not called?
int x = F1() + (cond?2:) + F2();

// What does this do? Does it skip the return if cond is false?
return (cond?2:);
Run Code Online (Sandbox Code Playgroud)

我认为你很难在所有这些情况下为操作员提出合理,直观和一致的行为,我认为除了简单的任务之外,它不会有任何用处.它只是不适合语言的其他部分 - 包括它会使语言更难学习,阅读,理解,实施和解释.只是一点点简洁,这是不值得的.

  • 做一行代码有什么问题吗,即 `if (someStatement) someBool = true; `? (3认同)

Jon*_*eet 16

基本上,您正在尝试将条件运算符用于不是为其设计的事物.

它并不意味着可选择采取某些行动 ......它意味着评估一个或另一个表达式,这是表达式的结果.

如果您只想在满足某些条件时执行操作,请使用if语句 - 这正是它的用途.

在您的示例中,您可以使用:

// Renamed someStatement to someCondition for clarity
someBool |= someCondition;
Run Code Online (Sandbox Code Playgroud)

要么

someBool = someCondition ? true : someBool;
Run Code Online (Sandbox Code Playgroud)

......换句话说"除非someCondition是真的,否则"使用现有价值......但就个人而言,我认为原始if陈述更清晰.

  • @JohanHjalmarsson:你可以在`bool`上写一个扩展方法,这样就可以编写`someCondition.MaybeReplace(ref current,newValue)`.但那会很可怕...... (4认同)