使用错误的默认参数

时间:2015-07-06 17:46:51

标签: c# unity3d xamarin mono

我现在正在做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

0 个答案:

没有答案