我在班上有这个:
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);
我想知道你哪里错了,应该多么正确。
答案 0 :(得分:4)
爆炸应该是这样的:
并且存在错误;不,它不应该。条件运算符始终是表达式,而不是语句。它在你使用它的方式上没有明确的含义。
如果您的意思是if
/ else
:请使用if
/ else
。
请注意,可以简化部分代码,但是:
(found ? OnFalseEvent : OnTrueEvent)?.Invoke(p);
这是有效的,因为条件部分使用作为表达式 - 意思是:值被消耗。在这种情况下,null-coalescing invoke 消耗。
请注意,如果OnFalseEvent
和OnTrueEvent
具有相同的委托类型,则仅才能正常工作。 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);
}
由于OnTrue
和OnFalse
不同类型,您无法将其作为
(found ? OnFalseEvent : OnTrueEvent)(p);
因为? :
必须为两个分支返回相同的类型