我无法找到关于此案例的文档,所以我很高兴知道这种行为是否有意,如果是,我可以在哪里找到它。
用例很简单:方法采用可选参数。在普通方法调用中,如果在方法调用中省略了参数,则将参数设置为指定的默认值。
将方法挂钩到不提供可选参数的事件也是有效的(请参阅下面的代码示例)。但是,这会导致意外行为:而不是表现相同(将参数初始化为指定的默认值),它实际上将其设置为其他内容。
以下断言将失败。我使用Unity的NUnit包装器在Unity3D 5.3.5f1中对此进行了测试,但我非常有信心这不应该是针对Unity的。
我希望这个问题不是太广泛,但我真的很感兴趣为什么会出现这种情况,以及是否在某处记录。
谢谢!
using NUnit.Framework;
using System;
public class EventWithOptionalParametersTests {
[Test]
public void Test() {
Foo foo = new Foo();
foo.OnEvent += this.HandleFooEvent;
foo.FireEvent();
}
private void HandleFooEvent(bool optional = false) {
Assert.AreEqual(false, optional); //assertion fails, optional = true
}
class Foo {
public event Action OnEvent;
public void FireEvent() {
if(this.OnEvent != null) {
this.OnEvent();
}
}
}
}