C# 如何获得;“真正的”/&引用;“内部”;来自lambda委托的Func委托 我想要达到的目标
我正在尝试实现一种方法,比较两个代理是否相等。C# 如何获得;“真正的”/&引用;“内部”;来自lambda委托的Func委托 我想要达到的目标,c#,lambda,delegates,expression,C#,Lambda,Delegates,Expression,我正在尝试实现一种方法,比较两个代理是否相等。 理想情况下,我不希望在编译器能够计算出可选参数时必须指定这些参数。 因此,如果我能像这里所示那样称呼它,那就太好了: public class Foo { public double Get(double d = 0.0) { return d; } } [TestMethod] public void TestMethod() { var foo = new Foo(); bool
理想情况下,我不希望在编译器能够计算出可选参数时必须指定这些参数。
因此,如果我能像这里所示那样称呼它,那就太好了:
public class Foo { public double Get(double d = 0.0) { return d; } }
[TestMethod]
public void TestMethod()
{
var foo = new Foo();
bool equal = CompareDelegates(() => foo.Get(), () => foo.Get());
// equal will be false here
}
private bool CompareDelegates(Func<double> d1, Func<double> d2)
{
return d1 == d2;
}
当然,你可以这样做:
private bool CompareDelegates(Func<double, double> d1, Func<double, double> d2)
{
return d1 == d2;
}
// being called like: equal = CompareDelegates(foo.Get, foo.Get);
private bool CompareDelegates(函数d1、函数d2)
{
返回d1==d2;
}
//被称为like:equal=CompareDelegates(foo.Get,foo.Get);
这看起来很不错,并且可以与可选参数一起使用。缺点:您必须为可能存在的所有可选参数编写一个重载
如果您有任何建议,我将不胜感激。过了一段时间,我找到了一种感觉像是解决问题的方法,但最终对我有效。 但仍然对任何不同的方法感兴趣
private bool CompareDelegates<T>(T d1, T d2) where T : Delegate
{
return d1 == d2;
}
private bool CompareDelegates(T d1,T d2),其中T:Delegate
{
返回d1==d2;
}
用法:
bool equal = CompareDelegates<Func<double,double>>(foo.Get, foo.Get); // returns true
bool equal=CompareDelegates(foo.Get,foo.Get);//返回true
使用此解决方案,您不必指定可选参数,而且它适用于Foo.Get(…)
可能具有的任何数量的参数。
不幸的是,编译器无法自行推断类型参数T
注意:其中T:Delegate
可用,但是。作为旁注:()=>foo.Get(),()=>foo.Get()
是两个不同的匿名方法,它们做相同的事情(调用foo.Get()
)。它们是不同的,所以它们不能相等。在第一个非工作示例中,您尝试比较它们,事实上它们是不同的。在第二个示例中,您查看表达式树的“内部”,并比较表达式树的“内容”(即代码的高级表示形式)。在第三个示例中,您放弃了匿名方法,直接使用委托到foo.Get
。第二个和第三个例子几乎都起作用了。
bool equal = CompareDelegates<Func<double,double>>(foo.Get, foo.Get); // returns true