2

比如说,我们有一个包含可选参数ClassA的方法。Foo因此,我们可以按照方法中所示使用它DoFoo

public class ClassA
{
    public ClassA() { }

    public void Foo(bool flag = true)
    {
    }

    public void DoFoo()
    {
        Foo(); // == Foo(true);
    }
}

一旦我需要将它传递给另一个班级ClassB。首先,我尝试将其传递为Action,但签名肯定不匹配。然后我将它作为 传递Action<string>,签名匹配,但参数 inClassB不再是可选的。但我确实想让它成为可选的,并想出了一个想法来声明一个代表。所以,它奏效了。

public delegate void FooMethod(bool flag = true);

public class ClassB
{
    Action<bool> Foo1;
    FooMethod Foo2;

    public ClassB(Action<bool> _Foo1, FooMethod _Foo2)
    {
        Foo1 = _Foo1;
        Foo2 = _Foo2;
    }

    public void DoFoo()
    {
        Foo1(true);
        Foo2(); // == Foo2(true);
    }

所以,问题是:我能否以某种方式将带有可选参数的方法作为参数传递,而不显式声明委托并保持其参数的可选质量?

4

1 回答 1

4

所以,问题是:我能否以某种方式将带有可选参数的方法作为参数传递,而不显式声明委托并保持其参数的可选质量?

不。“可选性”是方法签名的一部分,编译器需要在编译时知道它以提供默认值。如果您使用的委托类型没有可选参数,那么当您尝试在没有足够参数的情况下调用它时,编译器会做什么?

最简单的方法可能是包装它:

CallMethod(() => Foo()); // Compiler will use default within the lambda.
...
public void Foo(bool x = true) { ... }

public void CallMethod(Action action) { ... }
于 2012-10-04T13:59:21.087 回答