说,我们有ClassA
用方法Foo
包含可选参数。所以,我们可以按照方法中所示使用它DoFoo
.
public class ClassA
{
public ClassA() { }
public void Foo(bool flag = true)
{
}
public void DoFoo()
{
Foo(); // == Foo(true);
}
}
有一次我需要将它传递给另一个班级ClassB
。首先我尝试将其传递为Action
,但签名肯定不匹配。然后我将其传递为Action<string>
,签名匹配,但是参数在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);
}
所以,问题是:我能否以某种方式传递一个带有可选参数作为参数的方法,而无需显式声明委托并保持其参数的可选质量?
所以,问题是:我能否以某种方式传递一个带有可选参数作为参数的方法,而无需显式声明委托并保持其参数的可选质量?
不。“可选性”是方法签名的一部分,编译器需要知道这一点在编译时提供默认值。如果您使用的是委托类型doesn't有可选参数,当您尝试在没有足够参数的情况下调用它时,编译器打算做什么?
最简单的方法可能是包装它:
CallMethod(() => Foo()); // Compiler will use default within the lambda.
...
public void Foo(bool x = true) { ... }
public void CallMethod(Action action) { ... }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)