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

ここでの主な問題は、オブジェクトを IComparable オブジェクトとして使用する場合にのみ使用できる CompareTo メソッドを明示的に実装していることです。

この問題を解決するには、可視性を 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 に答える
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 に答える