1

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


4

6 回答 6

3

它们不是私有的,它们只是显式实现的。将变量声明为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);
}
于 2010-03-25T12:43:07.200 回答
1
var p1 = (IComparable)phi1;
var p2 = (IComparable)phi2;

Assert.IsTrue(p1.CompareTo(p2) == 0);
于 2010-03-25T12:43:36.713 回答
1

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

public class PersonHistoryItem : DateEntity, IComparable
{
    ...
    public int CompareTo(object obj)
    {
        PersonHistoryItem phi = (PersonHistoryItem)obj;
        return this.StartDate.CompareTo(phi.StartDate);
    }
}
于 2010-03-25T12:48:32.320 回答
0

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

int IComparable.CompareTo(object obj)

到:

public int CompareTo(object obj)
于 2010-03-25T12:43:57.947 回答
0

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

于 2010-03-25T12:44:57.617 回答
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);
    }
}
于 2010-03-25T12:48:28.360 回答