我正在尝试创建以下类名签名:
public class MyClass<T> where T : struct, MyBase
(我使用struct来约束Enums)
我收到错误
The class type constraint 'MyBase' must come before any other constraints
我理解这条消息,然而,重新安排我无法通过的代码或其他一些语法错误。如果有的话,我怎么能修好那条线?
如果必须,我会删除struct
。
谢谢
答案 0 :(得分:16)
约束是“和”在一起的; 所有必须满足约束。
在什么情况下,T可以是非可空值类型,而且可以通过标识,装箱或引用转换隐式转换为MyBase类?
没有这样的情况,所以没有可能的类型参数满足T的约束。而不是让你定义一组无法满足的约束,编译器根本不允许它。您不能声明同时需要struct
约束和class type
约束。
我正在使用struct来约束Enums
这说明了我的观点。由于没有从MyBase
继承的枚举,因此无法满足约束。
你能告诉我你的想法吗?例如,您认为它是否意味着“任何可以转换为MyBase的非可空值类型或”?我有兴趣了解为什么人们会相信C#的错误信息,以便我可以尝试改进它。
更新:啊,我明白了 - MyBase旨在成为MyClass<T>
的基类,而不是T
的基类。在C#中,它是:
class [class name] < [generic type parameters] >
: [base classes and interfaces]
where [type parameter] : [constraints]
您必须在约束之前放置基类和接口,否则编译器会认为它们 约束。
答案 1 :(得分:7)
您的意思是class MyClass<T> : MyBase where T : struct
吗?
答案 2 :(得分:1)
您将<T>
定义为两种不同的类型。
struct
是一种值类型,其中MyBase
是一个引用引用类型的类。
这不是可以互换的东西。
在这种情况下,它可能是:
public class MyClass<T> where T : struct
或
public class MyClass<T> where T : MyBase
Here是关于泛型以及如何使用它们的更多信息。
答案 3 :(得分:0)
如果T
必须是struct
,则它不能继承任何其他类型...值类型不支持继承。
答案 4 :(得分:0)
对此不是100%肯定,但快速检查MSDN会出现where (generic type constraint) (C# Reference):
public class MyClass<T, U> where T : MyBase where U : struct
不确定这是你想要的东西。