Универсальный класс не может соответствовать списку аргументов - PullRequest
2 голосов
/ 02 ноября 2010

Пытаясь написать свой первый универсальный класс на C #:

public class HighScoreList<ScoreType>
    where ScoreType : System.IComparable<ScoreType>
{
    ...

    public HighScoreList(List<ScoreType> highScoreList)
    {
          ....
    }

    ...
}

Я столкнулся с проблемами при написании для него модульных тестов.По какой-то причине он не может соответствовать списку аргументов конструктора и выдает ошибку:

Ошибка 7 Наилучшее совпадение перегруженного метода для 'TDGLX.FileManagement.HighScoreList.HighScoreList (System.Collections.Generic.List)'имеет недопустимые аргументы C: \ Users \ eric \ Documents \ Visual Studio 2010 \ Projects \ TDGLX \ UnitTests \ FileManagmentTest \ HighScoreListTest.cs 183 54 UnitTests

В этом и нескольких других тестах:

   HighScoreList<GenericScore> highScoreList =
        new HighScoreList<GenericScore>(new List<GenericScore>()
                {
                    new GenericScore("Person1",400),
                    new GenericScore("Person2",200),
                    new GenericScore("Person3",100)
                });

        HighScoreList<GenericScore> target =
            new HighScoreList<GenericScore>(highScoreList);

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

[Serializable()]
public class GenericScore : System.IComparable<GenericScore>
{
    public GenericScore(string name,int score)
    {
        Name = name;
        Score = score;
    }

    public string Name { get; set; }
    public int Score { get; set; }

    public int CompareTo(GenericScore other)
    {
        return this.Score.CompareTo(other.Score);
    }
}

Я действительно не могу понять, что не так с тестом.Что-то не так поняли в дженериках C #?

Ответы [ 2 ]

6 голосов
/ 02 ноября 2010
    HighScoreList<GenericScore> target =
        new HighScoreList<GenericScore>(highScoreList);

В приведенном выше коде вы передаете HighScoreList<GenericScore> конструктору HighScoreList<GenericScore>, но он ожидает List<GenericScore>

Разве это не то, что вы хотите?

    List<GenericScore> highScoreList = new List<GenericScore>()
            {
                new GenericScore("Person1",400),
                new GenericScore("Person2",200),
                new GenericScore("Person3",100)
            };

    HighScoreList<GenericScore> target =
        new HighScoreList<GenericScore>(highScoreList);
3 голосов
/ 02 ноября 2010

При втором вызове HighScoreList ctor вы передаете экземпляр HighScoreList<GenericScore> в качестве аргумента List<GenericStore> ctor, но HighScoreList<T> не наследует List<T>, следовательно, ошибка.

Как точка стиля, имена общих типов обычно начинаются с T, поэтому это будет HighScoreList<TScoreType> или просто HighScoreList<T>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...