我想将模板类型约束到特定的子类,如下所示:
// 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解释它。
答案 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
被约束为MyClassBase
和IEnumerable
(不太可能):
class MyClass<T> where T : MyClassBase, IEnumerable
// ^^^^^^^^^^^
// class type constraint must come before all other constraints