“Class of <T> where T : Enum” not working
Possible Duplicate:
Create Generic method constraining T to an Enum
有什么理由我们不能在C中这样做吗?如果可能的话,我怎么做类似的事情呢?
我想要什么:
1 2 3 4 5 6 7
| public class<T> ATag where T : enum {
[Some code ..]
}
public class<T> classBase where T : enum {
public IDictionary<T, string> tags { get; set; }
} |
所以,到了调用它的时候,我只能得到一个枚举值。
1 2 3 4 5 6 7 8 9 10
| public class AClassUsingTag : classBase<PossibleTags> {
public void AMethod(){
this.tags.Add(PossibleTags.Tag1,"Hello World!");
this.tags.Add(PossibleTags.Tag2,"Hello Android!");
}
}
public enum PossibleTags {
Tag1, Tag2, Tag3
} |
错误消息:"Constraint cannot be special class 'System.Enum'"。
谢谢您!
- 这是不可能的。看看这里的解决方法:stackoverflow.com/questions/79126/&hellip;
- 顺便说一下,说明书读起来很有趣,很有启发性。每个C程序员都应该熟悉它,当你对语言有疑问时,它应该是你的第一个来源。关于这个问题,特别是参考10.1.5。
- @杰森:是的,而且C 4注释规范特别棒。我不是说因为我贡献了注释-所有其他注释都很有趣:)
- @乔恩·斯基特:我同意,所有的注解都很有洞察力。
- @乔恩:有没有新版本的带注释的标准书?我找不到它。
- @克里斯:比哪个版本更新?我指的是这个:amazon.com/dp/0321741765
- 对不起…我的英语不太好,所以我在问之前没有发现任何与此相关的问题。嗯,对不起,谢谢你的回答!
- @乔恩:谢谢,我指的是这个:amazon.com/dp/0123725119,这就是我要找的。
你不能这样做,因为基本上规格说明你不能。这很烦人,但就是这样。clr毫无问题地支持它。我的猜测是,当第一次设计泛型时,clr可能不支持它,所以在语言中也被禁止了…或者是C小组当时没有收到关于支持它的备忘录,或者是包含它太晚了。代表们也同样恼人。
至于解决方法…看看我的无约束旋律计划。你自己也可以用同样的方法。我同时写了一篇博文,更详细。
- 你认为罗斯林会解决这类问题吗?
- @系列0:据我所知,它不在C 6的功能列表中…尽管这样做可能会更容易。(从罗斯林退房也很容易…)
- 我试图用一种方法把string转换成Enum,其中一条评论说添加where T : struct以使扩展方法起作用。但为什么有必要呢?是Enum.Tryparse的语法吗?
- @Stom:是的-只有当TEnum由于对它的约束而被认为是值类型时,才能调用Enum.TryParse;如果从自己的泛型方法调用它,则需要相同的约束来确保它是值类型。
- 这里有一个方法,它有一个约束where T : int,int是一个值类型,但是我得到编译时错误,为什么?'int' is not a valid constraint. A type used as a constraint must be an interface, a non-sealed class or a type parameter
- @斯托姆:现在你应该问一个新问题,因为它与这个答案真的不相关。但基本上编译器会告诉你我要告诉你的——约束是无效的。(它到底有什么用呢?如果int是您唯一可以使用的类型,那么它就不再是通用的了……)
- 现在有可能!在stackoverflow.com/a/8086788上找到它
这是不可能的。但是如果您对运行时检查感兴趣,可以
1 2 3 4 5 6 7 8 9 10
| class A <T >
{
static A ()
{
if(!typeof(T ).IsEnum)
{
throw new Exception ();
}
}
} |
不,我不相信。是的,使用设计模式绕过它,让基类返回允许的类型,派生类可以检查它。
Hth.