【问题标题】:? operator error in syntax, error in the else?语法中的运算符错误,else 中的错误
【发布时间】:2018-09-19 18:39:30
【问题描述】:

我班上有这个:

public delegate void OnTrue(String TestPassed);
public event OnTrue OnTrueEvent;

public delegate void OnFalse(String TestPassed);
public event OnFalse OnFalseEvent;

这是我的Do 方法:

public void Do()
{
   bool found=false;
   string p ="";

   // some actions

   found ? (OnTrueEvent != null ? OnTrueEvent(p): ;) :(OnFalseEvent != null ? OnFalseEvent(p): ;);
}

if in line 不起作用的问题。

展开应该是这样的:

if (found)
   if (OnFalseEvent != null)
      OnFalseEvent(p);
else
   if (OnTrueEvent != null)
      OnTrueEvent(p);

我想知道你错在哪里以及应该有多正确。

【问题讨论】:

  • 为什么不使用简单的if-else 块?
  • ';' ':' 之后不是有效的终止符(我不知道正确的翻译是什么,我有意大利语的视觉工作室)
  • ? : 是一个运算符,它必须返回一个值,这就是为什么: ; 是一个语法错误
  • 作为一般建议 - 你真的在这里滥用三元运算符并牺牲几行代码的可读性是一个非常糟糕的主意。我知道这不是你的问题,但我认为你应该使用你的“爆炸”变体。

标签: c# conditional-operator


【解决方案1】:

爆炸应该是这样的:

这就是错误;不,不应该。条件运算符始终是表达式,而不是语句。它在您使用它的方式中没有明确的含义。

如果你的意思是if/else:使用if/else

请注意,您可以简化一些代码,不过:

(found ? OnFalseEvent : OnTrueEvent)?.Invoke(p);

这是因为条件部分被使用作为表达式 - 意思是:值被消耗。在这种情况下,它被空合并调用消耗

请注意,这OnFalseEventOnTrueEvent 具有相同的委托类型时才有效,它们可能应该这样做。 Action<string> 可以正常工作。如果他们不这样做,您将需要更长的时间:

if(found)
    OnTrueEvent?.Invoke(p);
else
    OnFalseEvent?.Invoke(p);

(您选择的大括号和缩进留给读者作为练习)

【讨论】:

  • 请注意,?.Invoke(p) 只能在 C# 6.0 之后使用。
  • @Nisarg 由于当前版本是C#7.2,我想在C#6级别上回答是可以的。
  • @RenéVogt 我只是注意到这样一个事实,如果该语法不适用于 VS 2012 或 13,OP 就不会感到困惑。
【解决方案2】:

作为null 检查的替代方法,您可以将字段分配到什么都不做

public delegate void OnTrue(String TestPassed);
public event OnTrue OnTrueEvent = (item) => { }; // do nothing; not null

public delegate void OnFalse(String TestPassed);
public event OnFalse OnFalseEvent = (item) => { }; // do nothing; not null

...

public void Do() {
  ...

  // No need to check for null here
  if (found) 
    OnFalseEvent(p);
  else
    OnTrueEvent(p); 
}

由于OnTrueOnFalse不同的类型你不能把它当作

(found ? OnFalseEvent : OnTrueEvent)(p);

因为? : 必须为两个分支返回相同的类型

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 2018-08-30
    • 2018-07-21
    • 2012-11-19
    • 1970-01-01
    相关资源
    最近更新 更多