C#:IComparable实现私有

C#:IComparable实现私有,c#,nunit,icomparable,C#,Nunit,Icomparable,我是C#新手,所以这可能是一个非常糟糕的问题:我在类中实现了IComparable,并想用NUnit测试它。但是CompareTo方法被标记为私有,因此无法从测试中访问。 发生这种情况的原因是什么?我该如何解决? 可比性: public class PersonHistoryItem : DateEntity,IComparable { ... int IComparable.CompareTo(object obj) {

我是C#新手,所以这可能是一个非常糟糕的问题:我在类中实现了IComparable,并想用NUnit测试它。但是CompareTo方法被标记为私有,因此无法从测试中访问。
发生这种情况的原因是什么?我该如何解决?

可比性:

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


它们不是私人的,只是私人的。将变量声明为
IComparable
可以解决以下问题:

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

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

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

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

Assert.IsTrue(p1.CompareTo(p2) == 0);
在C#中,接口不定义访问器,因此您可以将
比较设置为
公共方法,并将显式接口实现更改为:

public int CompareTo(object obj)
致:

在C#中,接口不定义访问器,因此您可以将
比较设置为
公共方法,并将显式接口实现更改为:

public int CompareTo(object obj)
致:


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

执行此操作:
((IComparable)phi1).CompareTo(phi2)

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

要更正此问题,请将可见性指定为public并实现CompareTo方法,而不是“显式”:


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

要更正此问题,请将可见性指定为public并实现CompareTo方法,而不是“显式”:


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


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


谢谢,但是我不能在那里声明我的变量是可比较的。所以根据你的回答,我想另一个选择是隐式实现它们。我该怎么做呢?您也可以在assert语句中强制转换它们:
assert.IsTrue(((IComparable)phi1.CompareTo((IComparable)phi2))谢谢,但是我不能在那里声明我的变量为IComparable。所以根据你的回答,我想另一个选择是隐式实现它们。我该怎么做呢?您也可以在assert语句中强制转换它们:
assert.IsTrue(((IComparable)phi1.CompareTo((IComparable)phi2))
public class PersonHistoryItem : DateEntity,IComparable
{
    ...

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