【问题标题】:Equivalence operator overloading involving generics and interfaces涉及泛型和接口的等价运算符重载
【发布时间】:2013-11-02 15:52:19
【问题描述】:

我不知道如何编写运算符重载。请帮忙!

我有以下课程:

public class Nodegrid<N> where N : INode
{

}

在 Nodegrid 函数中,我希望能够编写类似的东西

N n1;
N n2;
//...
if (n1 == n2)
//...

但我不知道如何为 N 编写 == 运算符重载。我尝试使用

重载 INode
public static bool operator ==(INode n1, INode n2)
{
    return (n1.X == n2.X && n1.Y == n2.Y);
}

但这还不够。

我也尝试过重载 N 本身,但出现编译器错误,因为它希望我重载 Nodegrid,而不是 N。

如果可以,请提供代码,如果不行,请提出解决方法!

谢谢 黑格斯特罗姆


更新

目前我已经实现了以下解决方法,因为这是使用运算符重载无法完成的:

public static class NodeExts
{
    public static bool Equals(this INode n1, INode n2)
    {
        return (n1.X == n2.X && n1.Y == n2.Y);
    }
}

【问题讨论】:

  • 您可以发布自己问题的答案,您只需等待两天即可接受。如果您发现自己的问题,那么发布您自己的答案并接受它并没有错,它可能会帮助几个月或几年后访问该网站的人与您有同样的问题(并且它不会混乱每隔几周就会自动提升一个问题的首页)。
  • 我们确定这不能通过运算符重载来完成吗?我希望有人可能有办法做到这一点。如果没有,我会写下并接受我自己的答案。
  • 这就是它让你等待两天才让你接受的原因之一,有人可能会发布一个使用重载的解决方案(个人如果我发布了一个答案,那就是只做扩展方法您已经发布的解决方案)。

标签: c# operator-overloading


【解决方案1】:

编辑:这并不能解决他的问题,正在快速阅读问题。


这应该可以解决问题:

public static bool operator ==(Nodegrid<N> n1, Nodegrid<N> n2)
{
    return (n1.X == n2.X && n1.Y == n2.Y);
}

【讨论】:

  • 这是比较 Nodegrids,而不是 N 的? Nodegrid 没有 X 或 Y 的属性。
  • 哦,你是对的。正在快速阅读您的问题。您不能在接口中重载运算符,因此您需要将 INode 从接口更改为抽象类。见这里:stackoverflow.com/questions/1881459/…
  • 我的实现需要 INode 作为接口,因为我选择的 Nodegrid 使用 N 已经是其他东西的子类...
  • 我可以通过编写一个 IsEqual(INode n1, INode n2) 函数来解决这个问题,但我希望聪明点并使用运算符重载。
  • @ScottChamberlain 我认为保留 cmets 会很有用,这就是我没有删除答案的原因。
猜你喜欢
  • 2017-08-18
  • 2023-03-24
  • 2017-04-28
  • 2011-01-19
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
  • 2016-01-25
相关资源
最近更新 更多