Может ли кто-нибудь помочь мне с линией where TEntity : class, IEntity, new() в следующем объявлении класса.
public abstract class BaseEntityManager<TEntity>
where TEntity : class, IEntity, new()
Может ли кто-нибудь помочь мне с линией where TEntity : class, IEntity, new() в следующем объявлении класса.
public abstract class BaseEntityManager<TEntity>
where TEntity : class, IEntity, new()
where TEntity : ... применяет ограничения к общему параметру TEntity. В этом случае ограничения:
class: аргумент TEntity должен быть ссылочным типом
IEntity: аргумент должен быть или реализовывать интерфейс IEntity
new(): Аргумент должен иметь открытый конструктор без параметров
Ключевое слово where после объявления класса ограничивает тип типичного TEntity. В этом случае TEntity должен быть классом (это означает, что он не может быть типом значения, например int или DateTime), и он должен реализовать интерфейс IEntity. Ограничение new() указывает, что методы внутри этого класса имеют возможность вызвать конструктор по умолчанию для общего класса, представленный TEntity (например, new TEntity())
Где ограничение общего типа. Эти строки читают, что тип TEntity должен быть ссылочным типом, а не типом значения, должен реализовывать интерфейс IEntity и должен иметь конструктор, который не принимает никаких параметров.
Какой вопрос?
Позвольте мне принять во внимание то, что я думаю, вопрос. Ограничение гарантирует, что вы можете подклассифицировать BaseEntityManager с общим параметром, который является ссылочным типом, реализующим IEntity и содержащим конструктор без параметров.
E.X.
public class Product : IEntity {
public Product() {}
}
public class Wrong {
public Wrong() {}
}
public class WrongAgain : IEntity {
private Wrong() {}
}
// compiles
public ProductManager : BaseEntityManager<Product> {}
// Error - not implementing IEntity
public WrongManager : BaseEntityManager<Wrong> {}
/ Error - no public parameterless constructor
public WrongAgainManager : BaseEntityManager<WrongAgain> {}
см. текст ссылки