我现在正在做C#(使用Unity3D / Mono Runtime 2.6.5)一段时间,但是最近我遇到了一个非常奇怪的行为,当调用一个附加了布尔默认参数的方法的事件时。
直接附加它(情况1)时,它会以某种方式变为true
,即使默认值为false
。在通过lambda表达式(案例2)附加它时,它被正确设置为false
。
在任何情况下,我都没想到它会成为false
,而没有提供参数。
附上你可以找到这种奇怪行为的示例代码:
public class SomeClass
{
public event Action SomeEvent;
public void TriggerSomeEvent()
{
if (SomeEvent != null)
{
SomeEvent();
}
}
}
public class AnotherClass
{
public AnotherClass(SomeClass someClass)
{
someClass.SomeEvent += AnotherMethod; // Case 1: somehow "someParam" becomes true
someClass.SomeEvent += () => AnotherMethod(); // Case 2: "someParam" becomes the expected false
}
void AnotherMethod(bool someParam = false)
{
// How can "someParam" in the first case (see above) become true?
Debug.Log(someParam);
}
}
通过以下方式调用示例:
void OnGUI()
{
if(GUILayout.Button("test"))
{
var someClass = new SomeClass();
var anotherClass = new AnotherClass(someClass);
someClass.TriggerSomeEvent();
}
}
输出:
是的 假
像Iain Smith所指出的那样,输出更具有随机性。因此,第一个输出并不总是true
,它也会不时变为false
。