#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>