类约束必须位于任何其他约束之前

本文关键字:约束 其他 于任何 | 更新日期: 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

但不确定这是你想要的。