首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IComparable接口的实现

IComparable接口的实现
EN

Stack Overflow用户
提问于 2017-11-16 10:19:38
回答 1查看 127关注 0票数 2

我现在正在阅读c#6.0一书,下面的代码主题是“实现IComparable接口”。

我不知道几件事:

  1. 为什么在那里显式地实现IComparable.CompareTo
  2. 如果它只是CompareTo的另一个隐式重载(一个隐式int CompareTo (Note other),另一个隐式int CompareTo (object other) )呢?
代码语言:javascript
复制
public struct Note : IComparable<Note>, IEquatable<Note>, IComparable
{
   int _semitonesFromA;
   public int SemitonesFromA { get { return _semitonesFromA; } }

   public Note (int semitonesFromA)
   {
     _semitonesFromA = semitonesFromA;
   }

   public int CompareTo (Note other) // Generic IComparable<T>
   {
   if (Equals (other)) return 0; // Fail-safe check
   return _semitonesFromA.CompareTo (other._semitonesFromA);
   }

   int IComparable.CompareTo (object other) // Nongeneric IComparable
   {
   if (!(other is Note))
   throw new InvalidOperationException ("CompareTo: Not a note");
   return CompareTo ((Note) other);
   }

   public static bool operator < (Note n1, Note n2)
     => n1.CompareTo (n2) < 0;

   public static bool operator > (Note n1, Note n2)
     => n1.CompareTo (n2) > 0;

   public bool Equals (Note other) // for IEquatable<Note>
     => _semitonesFromA == other._semitonesFromA;

   public override bool Equals (object other)
   {
   if (!(other is Note)) return false;
   return Equals ((Note) other);
   }

   public override int GetHashCode() => _semitonesFromA.GetHashCode();
   public static bool operator == (Note n1, Note n2) => n1.Equals (n2);
   public static bool operator != (Note n1, Note n2) => !(n1 == n2);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-16 10:23:55

您可以隐式地实现IComparable,是的。但从根本上说,您希望阻止用户将Note与其他Note进行比较。如果IComparable,您可能有遗留用法,但是如果有任何直接了解Note类的信息,则不希望允许:

代码语言:javascript
复制
Note note = new Note();
Other other = new Other();
int result = note.CompareTo(other);

你知道这总是会抛出一个异常,那么为什么要允许它呢?基本上,将非泛型IComparable接口视为“某种遗留”(有有效的用途,但是.)并且通过显式地实现它来阻止任何人使用它。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47327044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档