类约束必须位于任何其他约束之前
本文关键字:约束 其他 于任何 | 更新日期: 2023-09-27 18:22:00
我正在尝试创建以下类名签名:
public class MyClass<T> where T : struct, MyBase
(我正在使用结构约束到枚举)
我收到错误
The class type constraint 'MyBase' must come before any other constraints
然而,我理解这条消息,重新排列了我无法通过的代码或其他语法错误。如果有的话,我该怎么修那条线?
如果必须,我将删除struct
。
感谢
约束是"和ed"在一起的所有必须满足约束。
在什么情况下,T既可以是不可为null的值类型,也可以通过标识、装箱或引用转换将隐式转换为类MyBase?
不存在这样的情况,因此不存在可能满足T约束的类型参数。编译器不允许您定义一组不能满足的约束,而是不允许它。您不能声明同时需要struct
约束和class type
约束。
我正在使用结构来约束到枚举
这说明了我的观点。由于没有从MyBase
继承的枚举,因此不可能满足该约束。
你能给我描述一下你认为这意味着什么吗?例如,您是否认为这意味着"任何不可为null的值类型或任何可转换为MyBase的类型"?我有兴趣了解为什么人们相信C#的错误之处,以便我可以尝试改进它。
更新:啊,我明白了——MyBase是MyClass<T>
的基类,而不是T
的基类。在C#中,它是:
class [class name] < [generic type parameters] >
: [base classes and interfaces]
where [type parameter] : [constraints]
您必须将基类和接口放在约束之前,否则编译器会认为它们就是约束。
你是说class MyClass<T> : MyBase where T : struct
吗?
您将<T>
定义为两种不同的类型。CCD_ 9是值类型,其中CCD_。这不是可以互换的东西。
在这种情况下,它将是:
public class MyClass<T> where T : struct
或
public class MyClass<T> where T : MyBase
以下是关于泛型以及如何使用它们的更多信息。
如果T
必须是struct
,则它不能从任何其他类型继承。。。值类型不支持继承。
对此没有100%的把握,但对MSDN的快速检查会发现以下内容:where(泛型类型约束)(C#参考):
public class MyClass<T, U> where T : MyBase where U : struct
但不确定这是你想要的。