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

C#中不兼容的匿名函数签名?,c#,.net,C#,.net,我想创建一个可以在对象上调用的扩展方法 返回值将由函数定义 类似这样的:(这只是一个例子) bool ismusic=person.Age.Apply(d=>{if(d>18)返回true; 返回false; }) 下面是扩展方法: public static Tout Apply<Tout>(this Object obj, Func< Tout> f) { return f( ); } public

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

返回值将由函数定义

类似这样的:(这只是一个例子)

bool ismusic=person.Age.Apply(d=>{if(d>18)返回true;
返回false;
})
下面是扩展方法:

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

            return f( );
        }
publicstatictout-Apply(此对象对象对象,Funcf)
{
返回f();
}
错误:匿名函数签名不兼容


我做错了什么

您的方法只需要一个
Func
——这是一个不带参数但返回值的函数


您的lambda表达式有一个参数(
d
)-看起来您假设它是一个整数。不清楚您想做什么,但是如果您想在lambda表达式中使用参数,您必须将签名从
Func
更改为
Func
或类似的内容,并在调用中提供一个参数。

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

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);
public static TOut ToFunc(此TProperty obj,Func f)
{
返回f(obj);
}
//用法
bool ismuture=个人年龄ToFunc(d=>d>18);

不管问题是什么,这似乎是一种奇怪的方法。

我已经设法做到了以下几点:

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

不过,对于小事情来说,这是一个不错的选择。(虽然最好有一个bool属性,它将指示
isMature
…但是…你知道,这很好。)

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

所以我可以写代码

var greaterThan18 = 20.ToFunc(n => n > 18);
但是,我为什么不写信呢

var greaterThan18 = 20 > 18;

所获得的只是一层间接性。

Jon我希望能够通过扩展方法检索类型为
Tout
的值,该方法将应用于
Tin
的任何类型。。。(而不是编写执行此逻辑的外部函数)。@RoyiNamir:您没有
TIn
——请查看您的代码;哪儿也看不见。您可以将方法更改为具有两个泛型类型参数,但您需要这样做。。。然后可能会将值传递给委托。重要的是你要了解你现在得到了什么,以及为什么它不起作用。顺便说一句<代码>如果(x)返回true;否则返回false简化为
返回x
所以你的lambda可以写成
d=>d>18
你想扩展
Object
还是想要一个通用扩展?@code为什么要删除你的答案?因为我误解了这个问题。我以为你想返回一个
Func
,而不是
兜售者。但是返回一个
TOut
我不清楚这个方法首先要实现什么,而仅仅调用
f
@codesinf应该使用扩展方法的值来执行。我补充了一个答案。(您的解决方案确实回答了我的问题)。将方法重命名为
Apply
。您没有转换为
Func
。但是,您可以执行
var isMature=person.age>18
,这样更好@是的。尽管这是一条实现功能的捷径,而不是一条实现功能的捷径,但请详述这条评论,你是在谈论副作用吗?正如Jodrell所说,使用此功能没有任何好处。这并不是说它不好,因为它很可能不会引起问题,它只是增加了额外的代码,额外的复杂性,并使程序变得更慢而没有任何好处。
  var isMature = theperson.Age.ToFunc(i => i > 18);
var greaterThan18 = 20.ToFunc(n => n > 18);
var greaterThan18 = 20 > 18;