Попробуйте generic type constraint. class
в этом контексте будет сдерживать T
как ссылочный тип. Вызывающие не смогут позвонить GetRandomRecord<DateTime>(dbSet)
, потому что DateTime
- это структура. Это будет выполняться компилятором.
public T GetRandomRecord<T>(DbSet<T> set) where T : class
{
// ... stuff
}
Это необходимо потому, что DBSet<TEntity>
имеет такое же ограничение:
public class DbSet<TEntity>
: DbQuery<TEntity>,
IDbSet<TEntity>,
IQueryable<TEntity>,
IEnumerable<TEntity>,
IQueryable,
IEnumerable
where TEntity : class
// M... O... U... S... EEEEE....
{
Так что компилятор не позволит вам делать то, что вы делаете, пока вы не можете гарантировать, что вы будете соблюдать это ограничение, что DbSet
есть. Вы можете предоставить эту гарантию, применив одно и то же ограничение к своему собственному методу, который говорит компилятору оставить вас в покое и выпустить это загадочное сообщение об ошибке у ваших абонентов.
И почему это необходимо? – FrozenHeart
@FrozenHeart В этом случае, вероятно, потому, что 'DbSet' имеет такое же ограничение на свой собственный параметр типа 'T'. –
@FrozenHeart Да, я только что проверил, и у него такое же ограничение. 'где TEntity: class' –