【问题标题】:C#: IComparable implementation privateC#:IComparable 实现私有
【发布时间】:2010-03-25 20:50:40
【问题描述】:

我是 C# 新手,所以这可能是一个非常垃圾的问题:我在课堂上实现了 IComparable 并希望使用 NUnit 对其进行测试。但是 CompareTo-Method 被标记为私有,因此无法从测试中访问。
这是什么原因,我该如何解决?

IComparable:

 
public class PersonHistoryItem : DateEntity,IComparable
    {
     ...
        int IComparable.CompareTo(object obj)
        {
            PersonHistoryItem phi = (PersonHistoryItem)obj;
            return this.StartDate.CompareTo(phi.StartDate);
        }
    }

测试:

 
        [TestMethod]
        public void TestPersonHistoryItem() {
            DateTime startDate = new DateTime(2001, 2, 2);
            DateTime endDate = new DateTime(2010, 2, 2);
            PersonHistoryItem phi1 = new PersonHistoryItem(startDate,endDate);

        PersonHistoryItem phi2 = new PersonHistoryItem(startDate, endDate);

        Assert.IsTrue(phi1.CompareTo(phi2)==0);
    }


【问题讨论】:

    标签: c# nunit icomparable


    【解决方案1】:

    他们不是私人的,他们只是explicitly implemented。将变量声明为 IComparable 应该可以解决问题:

    [TestMethod]
    public void TestPersonHistoryItem() {
        DateTime startDate = new DateTime(2001, 2, 2);
        DateTime endDate = new DateTime(2010, 2, 2);
        IComparable phi1 = new PersonHistoryItem(startDate,endDate);
    
        IComparable phi2 = new PersonHistoryItem(startDate, endDate);
    
        Assert.IsTrue(phi1.CompareTo(phi2)==0);
    }
    

    【讨论】:

    • 谢谢,但我不能在那里将我的变量声明为 IComparable。所以根据你的回答,我猜另一个选择是隐式实现它们。我该怎么做?
    • 你也可以在你的断言语句中强制转换它们:Assert.IsTrue(((IComparable)phi1).CompareTo((IComparable)phi2));
    【解决方案2】:

    我认为最简单的方法是使用隐式接口实现:

    public class PersonHistoryItem : DateEntity, IComparable
    {
        ...
        public int CompareTo(object obj)
        {
            PersonHistoryItem phi = (PersonHistoryItem)obj;
            return this.StartDate.CompareTo(phi.StartDate);
        }
    }
    

    【讨论】:

      【解决方案3】:
      var p1 = (IComparable)phi1;
      var p2 = (IComparable)phi2;
      
      Assert.IsTrue(p1.CompareTo(p2) == 0);
      

      【讨论】:

        【解决方案4】:

        您的方法使用显式接口实现。这意味着除非进行强制转换,否则接口方法不会出现在您的类上。 这样做:((IComparable)phi1).CompareTo(phi2)

        【讨论】:

          【解决方案5】:

          这里的主要问题是您显式实现了 CompareTo 方法,该方法仅允许您在将对象用作 IComparable 对象时使用它。

          要纠正该问题,请将可见性指定为公开,并不“显式”地实施 CompareTo 方法:

          public class PersonHistoryItem : DateEntity,IComparable
          {
              ...
          
              public int CompareTo(object obj)
              {
                  PersonHistoryItem phi = (PersonHistoryItem)obj;
                  return this.StartDate.CompareTo(phi.StartDate);
              }
          }
          

          【讨论】:

            【解决方案6】:

            在 C# 中,接口不定义访问器,因此您可以公开您的 CompareTo 方法并更改显式接口实现:

            int IComparable.CompareTo(object obj)
            

            收件人:

            public int CompareTo(object obj)
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-05-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多