Универсальный метод C #, отклоняющий тип, даже если он реализует требуемый интерфейс

#c# #generics #interface #type-conversion

#c# #общие положения #интерфейс #преобразование типов

Вопрос:

Надеюсь, я описал это правильно. У меня есть «универсальный метод», который выглядит следующим образом. Он принимает список любого Icomparable / Iequatable типа и возвращает класс ‘compareResult’, показанный ниже, содержащий списки совпадающих / непревзойденных элементов.

 public partial class Comparers
{
    public class compareResult<T>
    {
        public List<T> unchangedItems;
        public List<T> changedItems;
        public List<T> leftOrphans;
        public List<T> rightOrphans;
    }

    public static compareResult<T> stepCompare<T>(List<T> leftList, List<T> rightList, bool confirmUniqueIDs = true) where T : IEquatable<T>, IComparable
    {
        ...
  

Теперь я пытаюсь передать список ‘LicencedCustomer’, который определен как показано ниже, и реализует методы compareTo и Equals для реализации интерфейсов IComparable / IEquatable.

 public class LicencedCustomer : IEquatable<LicencedCustomer>, IComparable<LicencedCustomer>
    {

        public string LMAA_CODE {get; set;}
    ...
  

Теперь я пытаюсь передать два списка клиентов для каждого из приведенных ниже:

 Comparers.compareResult<LicencedCustomer> result = new Comparers.compareResult<LicencedCustomer>();

result = Comparers.stepCompare(leftList, rightList);
  

Но он говорит «Ошибка 1, тип ‘MFTests.’LicencedCustomer’ не может использоваться в качестве параметра типа ‘T’ в универсальном типе или методе ‘MF.Comparers.stepCompare(Система.Коллекции.Generic.List, System.Коллекции.Generic.List, bool)’. Из ‘MFTests нет неявного преобразования ссылки.Лицензированный пользователь ‘to’System.IComparable’…

Я думал, что реализовал IComparable, хотя это относится к преобразованию, которое я действительно не понимаю. Извините за длинное объяснение, я постарался сделать его как можно более кратким.

Есть мысли о том, что я делаю неправильно?

Ответ №1:

Универсальный метод не включает идентификатор универсального типа, T .

 where T : IEquatable<T>, IComparable
  

должно быть

 where T : IEquatable<T>, IComparable<T>