【问题标题】:c#: Actions incomparable?c#:动作无与伦比?
【发布时间】:2011-03-29 09:44:10
【问题描述】:

我正在尝试比较两个操作。与 == 的比较总是返回 false,就像 Equals 方法一样,即使它是同一个实例。

我的问题是:真的不可能还是我做错了?

干杯 交流

【问题讨论】:

  • 您能否发布获得这两个“相同实例”操作的代码?我相信你做错了。

标签: c# comparison action


【解决方案1】:

你做错了。

如果我相信你,当你说“即使它是同一个实例”时,通过LINQPad 执行的以下代码告诉我你一定做错了什么,或者“同一个实例”是不正确的:

void Main()
{
    Action a = () => Debug.WriteLine("test");
    Action b = a;

    (a == b).Dump("==");
    (a.Equals(b)).Dump("Equals");
    object.ReferenceEquals(a, b).Dump("ReferenceEquals");
}

输出是:

== 真的 等于 真的 引用等式 是的

换句话说,==a.Equals(b)object.ReferenceEquals(a, b) 都表示相同的实例。

另一方面,如果我复制代码:

Action a = () => Debug.WriteLine("test");
Action b = () => Debug.WriteLine("test");

然后他们都报假了。

如果我将它们都链接到命名方法,而不是匿名方法:

void Main()
{
    Action a = Test;
    Action b = Test;

    (a == b).Dump("==");
    (a.Equals(b)).Dump("Equals");
    object.ReferenceEquals(a, b).Dump("ReferenceEquals");
}

private static void Test()
{
}

那么输出是:

== 真的 等于 真的 引用等式 错误

换句话说,我现在有两个 Action 实例,不仅仅是一个,但它们仍然比较相等。

【讨论】:

  • 感谢您的解释。很有帮助。
【解决方案2】:

您可以比较MethodTarget 属性。

【讨论】:

    【解决方案3】:

    您可以比较action.Methodaction.Target

    【讨论】:

    • 好的,那么它们可能会有所不同!如果只需要检查方法,忽略目标,只比较Method
    猜你喜欢
    • 2013-04-25
    • 2016-07-23
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 2012-12-25
    • 2018-12-09
    • 1970-01-01
    • 2013-02-18
    相关资源
    最近更新 更多