【问题标题】:Optional arguments in a generic Func<>泛型 Func<> 中的可选参数
【发布时间】:2015-01-28 18:46:24
【问题描述】:

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

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

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

Func<string, object, string> dostuff

现在以原始形式,我可以在不指定第二个参数的情况下调用它,默认为null。但是当我在第二个程序集中将它用作回调时,我必须指定第二个参数。

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

【问题讨论】:

标签: c# generics


【解决方案1】:

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

Func<string, string> doStuffDelegate = s => dostuff(s);

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

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

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

【讨论】:

  • 那么,如果有两个程序集并且一个程序集有一个回调到另一个程序集,那么该委托签名包含在接收回调引用的那个程序集中吗?在声明实际回调函数的那个​​中,它必须匹配那个签名。
  • 当你在委托签名中使用可选参数时,它的Invoke方法的签名中也会有一个可选参数,对吧?
  • 还有一件事,对于您的 lambda 选项,它在哪里 - 在接收或声明回调函数的程序集中?
  • 两者都没有
  • 啊!我最初不明白你的意思......你的意思是方法重载回调,现在我明白了! :)
【解决方案2】:

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

dostuff(foo);

编译器将其翻译成:

dostuff(foo, null);

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

【讨论】:

  • 如果有委托,我可以或不能这样做?
  • @hbob 不能。你必须通过代表期望的任何东西。但当然,Servy的回答中已经说明了一些解决方法。
  • @Selman22 好吧,对于Func&lt;string, string&gt; 类型的委托,你不能这样做。您可以创建适当类型的委托。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多