2010-03-25 98 views
1

我是C#的新手,所以這可能是一個真正的轉儲問題:我在我的類中實現了IComparable,並且想用NUnit測試它。但是CompareTo方法被標記爲私有的,因此不能從測試中訪問。
這是什麼原因,我該如何解決這個問題?

了IComparable:C#:IComparable implementation private


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


回答

0

我認爲最簡單的方法是使用隱式接口實現:

public class PersonHistoryItem : DateEntity, IComparable 
{ 
    ... 
    public int CompareTo(object obj) 
    { 
     PersonHistoryItem phi = (PersonHistoryItem)obj; 
     return this.StartDate.CompareTo(phi.StartDate); 
    } 
} 
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); 
} 
+0

謝謝,但我不能在IComparable那裏聲明我的變量。所以根據你的回答,另一種選擇是隱式實現它們,我猜。我會怎麼做? – 2010-03-25 12:47:44

+0

你也可以在你的assert語句中強制轉換它們:'Assert.IsTrue(((IComparable)phi1).CompareTo((IComparable)phi2));'' – 2010-03-25 12:57:36

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

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

在C#中的接口並沒有定義訪問器,這樣就可以使你的CompareTo方法公開,改變由顯式接口實現:

int IComparable.CompareTo(object obj) 

要:

public int CompareTo(object obj) 
0

你的使用方法明確的接口實現。這意味着接口方法不會出現在你的課堂上,除非施放完成。 這樣做:((IComparable)phi1).CompareTo(phi2)

0

這裏的主要問題是,您明確實現了CompareTo方法,它只允許您在將對象用作IComparable對象時使用它。

要解決的問題,指定知名度公共和實現CompareTo方法不「明確」:

public class PersonHistoryItem : DateEntity,IComparable 
{ 
    ... 

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