类约束必须在任何其他约束之前

时间:2012-02-01 00:11:16

标签: c# class generics

我正在尝试创建以下类名签名:

public class MyClass<T> where T : struct, MyBase

(我使用struct来约束Enums)

我收到错误

The class type constraint 'MyBase' must come before any other constraints

我理解这条消息,然而,重新安排我无法通过的代码或其他一些语法错误。如果有的话,我怎么能修好那条线?

如果必须,我会删除struct

谢谢

5 个答案:

答案 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

不确定这是你想要的东西。