2011-08-28 54 views

回答

2

这意味着,填充任何类型的T位置必须是BaseQueueMessage本身,或从它派生的类。

因此可以这样说

public class MyQueueMessage : BaseQueueMessage { ... } 

public class MyJobProcessor<T> : BaseJobProcessor<T> where T : BaseQueueMessage { ... } 

MyJobProcessor<MyQueueMessage> jobProcessor = ... 

但你不能说

MyJobProcessor<string> jobProcessor = 

因为string不会从BaseQueueMessage

+0

感谢所有派生的,所有有效的答案@ siride的例子帮我更好地支持 –

+0

@flybyte:但请注意BrokenGlass的第二段,这解释了约束有用的另一个原因。 – siride

3
public abstract class BaseJobProcessor<T> : JobProcessor where T : BaseQueueMessage {} 

它有一个类型参数T这是BaseQueueMessage类型的抽象泛型类的定义。它会导致编译时错误,尝试创建从BaseJobProcessor派生的泛型类的任何实例,并将其传递一个非BaseQueueMessage派生类型的类型参数。

这通常是这样做的,你可以在BaseJobProcessor类的代码中做一些假设为T,在这个例子中,将允许使用在所创建的T类型的所有实例上BaseQueueMessage定义的所有公共方法和属性/内BaseJobProcessor<T>.访问(如果你没有足够的约束,你只能够在T类型的任何实例中使用object方法/属性)