C#中不兼容的匿名函数签名?

时间:2013-02-06 16:23:05

标签: c# .net

我想创建一个可以在对象上调用的扩展方法。

返回值将由函数定义。

这样的事情:(这只是一个例子

bool isMature= thePerson.Age.Apply<bool>(d =>   {    if (d >18) return true;
                                                        return false;
                                                 })

这是扩展方法:

  public static Tout Apply<Tout>(this Object obj, Func< Tout> f)  
        {

            return f( );
        }

错误:不兼容的匿名函数签名

我做错了什么?

4 个答案:

答案 0 :(得分:6)

您的方法仅需Func<Tout> - 这是一个 没有参数的函数,但返回值。

你的lambda表达式有一个参数(d) - 看起来你假设它是一个整数。目前还不清楚你要做什么,但是如果你想在lambda表达式中使用一个参数,你将不得不将签名从Func<TResult>更改为Func<TArg, TResult>或类似的东西 - 并在调用中提供参数。

答案 1 :(得分:3)

如果您期望委托实例的输入是属性值,那么您需要更改扩展方法的定义以获取此参数:

public static TOut ToFunc<TProperty, TOut>(this TProperty obj, Func<TProperty, TOut> f)  
{
   return f(obj);
}

// Usage
bool isMature = thePerson.Age.ToFunc<int, bool>(d => d > 18);

无论问题是什么,似乎都是一种奇怪的方法。

答案 2 :(得分:2)

这是一个毫无意义的练习,devdigital已经回答了你的问题,但答案是什么用。

所以我可以编写代码,

var greaterThan18 = 20.ToFunc(n => n > 18);

但是,为什么我不写

var greaterThan18 = 20 > 18;

所获得的只是一层间接。

答案 3 :(得分:0)

我设法做了类似的事情:

  public static Tout ToFunc<T,Tout>(this T obj, Func<T, Tout> f)  
        {
            return f(obj);
        }

调用是

  var isMature = theperson.Age.ToFunc<int, bool>(i => i > 18);

但是,我讨厌每次都指定<int, bool>

但是感谢resharper - 提醒我 - 我可以调用它:

  var isMature = theperson.Age.ToFunc(i => i > 18);

对于小事来说,它是一个很好的工具。 (虽然最好有一个bool属性,表示isMature ....但是....你知道,它很好。)