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