代码之家  ›  专栏  ›  技术社区  ›  Dan Tao

我可以定义一个方法来接受Func<T>或表达式吗?

  •  7
  • Dan Tao  · 技术社区  · 14 年前

    如果我试图写一个方法的两个重载,其中一个接受 Expression<Func<T>> 参数和另一个接受 Func<T> ,在尝试使用lambda表达式调用该方法时,将出现编译器错误,因为这两个签名会产生歧义。例如,以下情况可能会有问题:

    Method(() => "Hello"); // Is that a Func<string>,
                           // or is it an Expression<Func<string>>?
    

    我明白了。但我不喜欢接受 Expression<Func<string>> ,因为这将强制调用代码使用lambda表达式。如果我也想接受一个方法组呢?

    我提出这个问题的基础是,我正在编写一些代码,希望能够编写这样的代码:

    Method(() => "Hello");
    

    …然后输出如下:

    Executed '() => "Hello"' and got "Hello" back.

    Method(ReturnHello);
    

    …然后输出如下:

    Executed 'ReturnHello' and got "Hello" back.

    有没有什么方法可以做到我想在这里做的,而不只是使用两个不同的方法名(例如。, ExpressionMethod FuncMethod

    2 回复  |  直到 14 年前
        1
  •  1
  •   Samuel Neff    14 年前

    你可以重载一个方法来获取 Func<T> Expression<Func<T>> 但是,当您这样做时,自动类型确定失败,因此您需要通过强制转换显式地定义类型。这样地:

    public static void Test()
    {
        Test((Func<string>)(() => "helllo"));
        Test((Expression<Func<string>>) (() => "hello"));
    }
    
    public static void Test<T>(Func<T> func)
    {
    
    }
    
    public static void Test<T>(Expression<Func<T>> expression)
    {
    
    }
    

    不漂亮。

        2
  •  1
  •   Paw Baltzersen    14 年前

    可以使用默认值为空的两个命名参数创建一个方法。

    public static void Test<T>(Func<T> func = null, Expression<Func<T>> expression = null)
    {
    }
    

    推荐文章