System.Enum as a generic type parameter with constraints
Possible Duplicate:
Create Generic method constraining T to an Enum
Enum type constraints in C#
考虑以下类别:
1 2 3 4 5 6 7 8
| public class Transition <TState >
{
public Transition ()
{
if (!typeof(TState ).IsEnum)
throw (new ArgumentException ("[TState] has to be of type [System.Enum]."));
}
} |
理想情况下,这应该声明为:
1 2 3
| public class Transition<TState> where TState: System.Enum
{
} |
当然,上面的代码会产生编译时错误。我的问题是,为什么这是违法的。大多数消息来源解释说这是非法的,但没有解释为什么。有什么想法吗?
- 这个话题已经讨论过很多次了。请在发布问题之前进行搜索。可能与将t约束到枚举的create generic方法重复。还有一个重复:stackoverflow.com/questions/7244/&hellip;
- 它已经在这里回答了stackoverflow.com/questions/1331739/&hellip;
- @达林迪米特洛夫:这两个问题不是重复的。事实上,这是拉法尔指出的一个复制品。我不想到处找工作。只是在寻找背后的原因。编辑:这个问题的链接在这里。
- @Raheelkhan,这个特性是在CIL级别实现的,只是在C中没有实现。如果你读到我的第二个dupe链接,你会发现有一个解决方法,如jon skeet所示,他写了一个很好的助手。看看他的博客帖子:msmvps.com/blogs/jon ou skeet/archive/2009/09/11/1722426.aspx
- 我知道这有帮助。如果你在发帖前搜索过你的问题,那将是谷歌的第一次或第二次点击。下次请这样做。
- 我已经编辑了你的标题。请看,"问题是否应该在标题中包含"标签"?如果共识是"不,他们不应该"。
正如埃里克·利珀特所说,我引用
ALL features are unimplemented until someone designs, specs, implements, tests, documents and ships the feature. So far, no one has done that for this one. There's no particularly unusual reason why not; we have lots of other things to do, limited budgets, and this one has never made it past the"wouldn't this be nice?" discussion in the language design team."
- 如果C小组没有对System.Enum的可用性作为类型约束采取任何蓄意的行动,那么指定T:System.Enum可能是为了限制可以传递为System.Enum或枚举类型的类型,但不允许类对T做任何事情,而不是这与System.Enum无关。C小组显然决定,由于声明T:enum的人可能希望T无法提供功能,他们应该添加代码以明确禁止这种约束。
- 指定System.Enum约束的能力并不是一个开始时未实现的特性;指定System.Enum约束的能力仅用于编译时验证参数类型的有限目的是一个特性,虽然该特性没有理想的那么有用,但它将被"免费"实现,但用于决定主动阻止它。