通用Func 中的可选参数

我在程序集中有以下方法:

public string dostuff(string foo, object bar = null) { /* ... */ } 

我将它用作回调函数,因此对它的引用会传递给另一个程序集:

 Func dostuff 

现在在原始forms中,我可以调用它而不指定第二个参数,默认为null 。 但是当我在第二个程序集中使用它作为回调时,我必须指定第二个参数。

什么语法允许我忽略第二个参数?

您需要创建一个只接受一个参数的新方法,并传递第二个参数的默认值。 您可以使用lambda执行此操作,而不是创建新的命名方法(如果需要):

 Func doStuffDelegate = s => dostuff(s); 

另一种选择是使用一个签名具有可选的第二个参数的委托,而不是使用Func ,在这种情况下,您的方法的签名将匹配:

 public delegate string Foo(string foo, object bar = null); 

您可以直接将dostuff分配给类型为Foo的委托,并且在调用该委托时您只能指定一个参数。

你不能这样做,因为可选参数是语法糖 ,只有在你直接调用方法时才能使用。 当您调用这样的方法时:

 dostuff(foo); 

编译器将其转换为:

 dostuff(foo, null); 

在其他情况下,例如使用不接受可选参数的delegate或使用reflection调用此方法时,您必须提供可选参数。