C# 如何将带有可选参数的方法作为参数传递?

C# 如何将带有可选参数的方法作为参数传递?,c#,delegates,optional-parameters,C#,Delegates,Optional Parameters,比如说,我们有ClassA,方法Foo包含一个可选参数。因此,我们可以使用它,如方法DoFoo所示 public class ClassA { public ClassA() { } public void Foo(bool flag = true) { } public void DoFoo() { Foo(); // == Foo(true); } } 有一次,我需要将它传递给另一个类ClassB。首先,我尝试将其

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

public class ClassA
{
    public ClassA() { }

    public void Foo(bool flag = true)
    {
    }

    public void DoFoo()
    {
        Foo(); // == Foo(true);
    }
}
有一次,我需要将它传递给另一个类
ClassB
。首先,我尝试将其作为
操作
传递,但签名肯定不匹配。然后我将其作为
Action
传递,签名匹配,但是
ClassB
中的参数不再是可选的。但我确实想让它成为可选的,并想出了一个主意来声明一个委托。所以,它成功了

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);
    }
public委托方法(bool标志=true);
公共B类
{
行动1;
方法Foo2;
公共类B(操作1,方法2)
{
Foo1=\u Foo1;
Foo2=_Foo2;
}
公屋
{
Foo1(真);
Foo2();//==Foo2(真);
}
因此,问题是:我是否可以在不显式声明委托的情况下,以某种方式将带有可选参数的方法作为参数传递,并保持其参数的可选性

因此,问题是:我是否可以在不显式声明委托的情况下,以某种方式将带有可选参数的方法作为参数传递,并保持其参数的可选性

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

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

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

public void CallMethod(Action action) { ... }
因此,问题是:我是否可以在不显式声明委托的情况下,以某种方式将带有可选参数的方法作为参数传递,并保持其参数的可选性

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

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

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

public void CallMethod(Action action) { ... }

重复的@DamianSchenkelman不是重复的,问题是,是否可以有其他的解决办法。@DamianSchenkelman的重复不是重复的,问题是,是否可以有其他的解决办法。。虽然这种方法不可能将非默认参数传递给
Foo
,但我非常喜欢它,特别是因为我的凯斯,这是我的问题,我想我可能不知道用什么C方法来定义smth,比如
动作
。@KonstantinVasilcov:“比如”不够详细,无法理解您的意思。当然,您可以声明自己的委托类型,但如果您希望使用泛型类型的可选参数声明泛型委托类型,则唯一的默认值将是default(t)。就是这样,我知道了。非常感谢!虽然这种方法不可能将非默认参数传递给
Foo
,但我非常喜欢它,尤其是在我的情况下,这就足够了。至于我的问题,我想我可能不知道一些C方法来定义smth,比如
动作
。@KonstantinVasilcov:“类似的东西”还不够详细,无法理解您的意思。您当然可以声明自己的委托类型,但如果您想声明具有泛型类型的可选参数的泛型委托类型,则唯一的默认值将是default(t)。就是这样,我已经得到了它。非常感谢!