Может ли кто-нибудь помочь мне с линией 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> {}
см. текст ссылки