2012-02-01 185 views
5

我试图创建下面的类名的签名:类约束必须出现在任何其他约束

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

(我使用结构约束,以枚举)

我收到错误

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

我知道这条消息,但是,重新排列代码我无法越过那个或其他语法错误。如果可以的话,我该如何修复这条线?

如果必须,我会删除struct

谢谢

+0

谢谢大家,因为你们用不同的方式阅读你的不同选择。 – 2012-02-01 00:27:24

+1

坏消息传播缓慢,你不能限制System.Enum的类型参数。历史对枚举并不友好,它们的实现类型具有不同的大小,从而在结构上不兼容。 C语言中的一个优化太多了,因为互操作而被C#困住了。 – 2012-02-01 00:58:04

回答

7

您的意思是class MyClass<T> : MyBase where T : struct

+1

谢谢。当我尝试类似这样的事情时,我加了一个逗号','。 “光线是绿色的,陷阱很干净。” – 2012-02-01 00:24:48

1

你定义<T>作为两个不同的类型。 struct是一个值类型,其中MyBase是引用引用类型的类。 这不是可以互换的东西。

在这种情况下,这将是两种:

public class MyClass<T> where T : struct

public class MyClass<T> where T : MyBase

Here是关于泛型和如何使用他们,所以更多的信息。

0

如果T必须是struct,它不能从任何其他类型继承...值类型不支持继承。

16

约束条件被“编辑”在一起; 全部必须满足约束条件。

在什么情况下可以T为既非空值类型并且还是经由身份,拳击或引用转换隐式转换为类MyBase?

没有这样的情况,所以没有可能的类型参数满足T的约束条件。编译器不会让你定义一组无法满足的约束条件,而是简单地禁止它。您不能说您需要约束structclass type约束。

我使用结构约束,以枚举

,说明我的观点。由于没有从MyBase继承的枚举,所以不可能满足约束条件。

你能为我描述一下你的想法吗?例如,您是否认为这意味着“任何不可空值类型任何可转换为MyBase的类型”?我有兴趣了解为什么人们相信C#的虚假事情,以便我可以尝试改进它。

更新:啊,我看到 - MyBase旨在成为基类MyClass<T>,而不是基类T。在C#中,有云:

class [class name] < [generic type parameters] > 
    : [base classes and interfaces] 
    where [type parameter] : [constraints] 

你必须把基础类和接口之前的约束,否则编译器认为他们的约束。

0

不是100%肯定这一点,但MSDN的快速检查出现这种where (generic type constraint) (C# Reference)

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

不知道这是你在找什么,但。

+1

如果有任何迹象表明他需要两种截然不同的对象化类型,一种是彼此独立的,但目前没有这种迹象,这将是有效的。看起来好像他仅仅对单个类型参数的约束具有竞争欲望。 – 2012-02-01 00:21:10

+0

@AnthonyPegram - 这是一个有效的点,但我读了不同的问题。对我而言,OP的设计目标并不完全清楚,这就是为什么我要提出警告的原因。 – Tim 2012-02-01 00:22:58