【问题标题】:Assign a method with default values to Func<> without those parameters?在没有这些参数的情况下将具有默认值的方法分配给 Func<>?
【发布时间】:2012-11-28 03:06:59
【问题描述】:

我希望能够做到以下几点:

Func<int,bool> tryMethodFunc = TryMethod;

其中 TryMethod 的签名如下:

bool TryMethod(int value, int value2 = 0, double value3 = 100.0)

我不反对将方法分解为柯里化格式,但如果没有这种方法可以做到这一点,那就更有效了。

【问题讨论】:

  • 我明白了,拥有Func&lt;int,bool&gt; tryMethodFunc =&gt; (value) =&gt; TryMethod(value) 还不够吗?
  • 嗯,确实有效。猜猜我只是功能方法的新手。你可以把它作为答案,我会标记它。
  • 欢迎标记柯彦的答案;它非常全面,包含我的解决方法。
  • @ChrisSinclair:KeYan的回答好像被删了……

标签: c# .net functional-programming func


【解决方案1】:

可选参数是一种语言特性,编译器负责将对带有可选参数的方法的调用转换为带有值的完整调用。

看看下面这段简单的代码,

    public void GeneralMethod()
    {
        TestMethod(6);
    }

    public bool TestMethod(int a, int b = 8)
    {
        return true;
    }

当您反汇编这些方法时,您会看到 C# 编译器实际上将带有一个参数的 TestMethod 调用替换为带有两个参数的调用。来自 ildasm 的屏幕截图证明,

现在,谈到当前的问题,有问题的代码行试图将 Func 与具有可选参数的方法绑定。如果 C# 编译器必须处理这个问题,它必须确保 Func 有些知道默认值。虽然这可以通过编译器实现,但它完全违背了 Func 的目的。

Func 的目的是提供一种以通用且简单的方式存储匿名方法的方法。" reference

stackoverflow中另一个类似的问题可以找到here

@Chris Sinclair 的解决方案通过创建一个匿名方法来解决这个问题,该方法接受一个参数并从该匿名方法的主体调用 TryMethod。

【讨论】:

    猜你喜欢
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多