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