C #: частная реализация IComparable - PullRequest
1 голос
/ 25 марта 2010

Я новичок в C #, так что это может быть действительно дамп вопрос: я реализовал IComparable в своем классе и хочу проверить его с NUnit Но метод CompareTo помечен как закрытый и поэтому недоступен из теста.
В чем причина этого и как я могу это исправить?

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);</p>

<pre><code>        PersonHistoryItem phi2 = new PersonHistoryItem(startDate, endDate);

        Assert.IsTrue(phi1.CompareTo(phi2)==0);
    }


Ответы [ 6 ]

3 голосов
/ 25 марта 2010

Они не являются частными, они просто явно реализованы . Объявление ваших переменных как 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 голос
/ 25 марта 2010
var p1 = (IComparable)phi1;
var p2 = (IComparable)phi2;

Assert.IsTrue(p1.CompareTo(p2) == 0);
0 голосов
/ 25 марта 2010

Я думаю, что самый простой способ - использовать неявную реализацию интерфейса:

public class PersonHistoryItem : DateEntity, IComparable
{
    ...
    public int CompareTo(object obj)
    {
        PersonHistoryItem phi = (PersonHistoryItem)obj;
        return this.StartDate.CompareTo(phi.StartDate);
    }
}
0 голосов
/ 25 марта 2010

Основная проблема заключается в том, что вы явно реализуете метод CompareTo, который позволяет использовать его только при использовании вашего объекта в качестве объекта IComparable.

Чтобы исправить проблему, задайте видимость как общедоступную и реализуйте метод CompareTo не "явно":

public class PersonHistoryItem : DateEntity,IComparable
{
    ...

    public int CompareTo(object obj)
    {
        PersonHistoryItem phi = (PersonHistoryItem)obj;
        return this.StartDate.CompareTo(phi.StartDate);
    }
}
0 голосов
/ 25 марта 2010

Ваш подход использует явную реализацию интерфейса. Это означает, что методы интерфейса не будут отображаться в вашем классе, если не выполняется приведение. Сделайте это: ((IComparable)phi1).CompareTo(phi2)

0 голосов
/ 25 марта 2010

В C # интерфейс не определяет методы доступа, поэтому вы можете сделать ваш метод CompareTo общедоступным и изменить явную реализацию интерфейса с:

int IComparable.CompareTo(object obj)

Кому:

public int CompareTo(object obj)
...