c where类中的“where”关键字

时间:2009-10-21 02:50:10

标签: c# .net generics

任何人都可以帮助我使用以下类声明中的行where TEntity : class, IEntity, new()

public abstract class BaseEntityManager<TEntity>
        where TEntity : class, IEntity, new()

4 个答案:

答案 0 :(得分:28)

where TEntity : ...将约束应用于通用参数TEntity。在这种情况下,约束是:

class:TEntity的参数必须是引用类型
IEntity:参数必须是或实现IEntity接口
new():参数必须具有公共无参数构造函数

来自http://msdn.microsoft.com/en-us/library/d5x73970.aspx

答案 1 :(得分:4)

类声明后的where关键字限制泛型TEntity的类型。在这种情况下,TEntity 必须是一个类(意味着它不能是intDateTime之类的值类型),并且必须< / em>实现接口IEntitynew()约束表示此类中的方法可以调用TEntity表示的泛型类的默认构造函数(例如new TEntity()

答案 2 :(得分:0)

泛型类型约束在哪里。这些行读取TEntity类型必须是引用类型而不是值类型,必须实现接口IEntity并且它必须具有不带参数的构造函数。

http://msdn.microsoft.com/en-us/library/bb384067.aspx

答案 3 :(得分:-1)

问题是什么?

让我拍摄一下我认为的问题。约束确保您只能使用泛型参数继承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> {}

请参阅link text