C#:IComparable实现私有

时间:2010-03-25 12:40:23

标签: c# nunit icomparable

我是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);
    }

PersonHistoryItem phi2 = new PersonHistoryItem(startDate, endDate); Assert.IsTrue(phi1.CompareTo(phi2)==0); }


6 个答案:

答案 0 :(得分:3)

他们不是私人的,只是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);
}

答案 1 :(得分:1)

var p1 = (IComparable)phi1;
var p2 = (IComparable)phi2;

Assert.IsTrue(p1.CompareTo(p2) == 0);

答案 2 :(得分:0)

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

int IComparable.CompareTo(object obj)

要:

public int CompareTo(object obj)

答案 3 :(得分:0)

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

答案 4 :(得分:0)

这里的主要问题是你明确地实现了CompareTo方法,它只允许你在将对象用作IComparable对象时使用它。

要更正此问题,请将可见性指定为public,并且不要“明确地”实现CompareTo方法:

public class PersonHistoryItem : DateEntity,IComparable
{
    ...

    public int CompareTo(object obj)
    {
        PersonHistoryItem phi = (PersonHistoryItem)obj;
        return this.StartDate.CompareTo(phi.StartDate);
    }
}

答案 5 :(得分:0)

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

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