?语法中的运算符错误,else中的错误

时间:2018-04-10 08:14:49

标签: c# conditional-operator

我在班上有这个:

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 (found)
   if (OnFalseEvent != null)
      OnFalseEvent(p);
else
   if (OnTrueEvent != null)
      OnTrueEvent(p);

我想知道你哪里错了,应该多么正确。

2 个答案:

答案 0 :(得分:4)

  

爆炸应该是这样的:

并且存在错误;不,它不应该。条件运算符始终是表达式,而不是语句。它在你使用它的方式上没有明确的含义。

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

请注意,可以简化部分代码,但是:

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

这是有效的,因为条件部分使用作为表达式 - 意思是:值被消耗。在这种情况下,null-coalescing invoke 消耗

请注意,如果OnFalseEventOnTrueEvent具有相同的委托类型,则才能正常工作。 Action<string>可以正常工作。如果他们没有,你需要更长的时间:

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

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

答案 1 :(得分:1)

作为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);

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