Ошибка обобщения

240
19 января 2018, 21:47

Есть много сущностей, которые наследуются от класса BaseEntity<TKey>. Операции, которые необходимо проводить над сущностями, абсолютно одинаковые, по этому был создан класс DataService<TEntity, TKey> where TEntity: BaseEntity<TKey>. В методах класса возникает ошибка при использовании ключа:

Это один и тот же тип, но компилятор этого признавать не хочет. Как это исправить?

Пример кода, приводящего к ошибке:

public Task<BaseEntity<TKey>> Get(TKey id)
{
    return DataService.FirstOrDefaultAsync(u => u.Id == id);
}

Ограничения where TKey : IComparable, IEquatable<TKey> ошибку не исправляют

Answer 1

Компилятор признает, что это один и тот же тип. Он говорит, что у этого типа может не быть оператора ==.

Ты можешь использовать вместо него метод Equals, который должен быть переопределён у всех типов, у которых есть переопределение оператора ==.

Если речь о ссылочных типах, и необходимо сравнение по ссылке ReferenceEquals. Так же вы можете добавить ограничение для TKey - IComparable или IEquatable и использовать методы этих интерфейсов для сравнения.

READ ALSO
В чем разница между Type и TypeInfo?

В чем разница между Type и TypeInfo?

По моему, они имеют похожее назначение и очень похожи между собой

242
Функция, работающая только 10 раз в минуту c# [требует правки]

Функция, работающая только 10 раз в минуту c# [требует правки]

Функция вызывается, если в консоль пишешь test Если много раз писать это слово, то будет флуд, надо чтобы функцию можно было вызывать 10 раз в минуту

279
Автоматический Deploy через Remote Debugger VS17

Автоматический Deploy через Remote Debugger VS17

Как настроить remote debugger на visual studio 2017 так, чтобы при сборке на компьютере приложения новый файлы отправлялись на компьютер, на котором ведется...

291
Помощь с Split С#

Помощь с Split С#

ЗдравствуйтеУ меня есть длинная строка, в которой есть переходы на новую строку, вопросительные, восклицательные знаки, точки

228