泛型类型约束语法与继承语法冲突

时间:2018-05-01 13:09:33

标签: c# .net generics syntax

我想将模板类型约束到特定的子类,如下所示:

// This class contains generic list template
// but specific implementation can be used
class MyClass<T> where T: IEnumerable {}

但我也希望实现一个没有模板的类,即

class MyClass: MyClassBase {}

但我如何将这两件事结合起来呢?这是一个错误:

class MyClass<T> where T: IEnumerable : MyClassBase {}

也是错误:

class MyClass<T> where T: IEnumerable, : MyClassBase {}

错误:

class MyClass<T> (where T: IEnumerable) : MyClassBase {}

错误:

class MyClass<T where T: IEnumerable>: MyClassBase {}

正确的语法是什么? MSDN doesn't bother解释它。

3 个答案:

答案 0 :(得分:3)

正确的语法是先指定继承,然后添加where

class MyClass<T> : MyClassBase where T: IEnumerable {
}

以下是Spring docs: externalized configuration,指明class_base位于type_parameter_constraints_clauses之前:

class_declaration ::= attributes? class_modifiers? partial? class
    identifier type_parameter_list?
    class_base?
    type_parameter_constraints_clauses? class_body ;?

答案 1 :(得分:0)

private class BaseClass    { }

private class MyClass<T> : BaseClass
     where T : IEnumerable
{

}

答案 2 :(得分:0)

如果您希望MyClass<T>继承MyClassBase

class MyClass<T> : MyClassBase where T : IEnumerable
//               ^^^^^^^^^^^^^
// inherited / implemented types come before `where`

如果您希望T被约束为MyClassBaseIEnumerable(不太可能):

class MyClass<T> where T : MyClassBase, IEnumerable
//                         ^^^^^^^^^^^
// class type constraint must come before all other constraints