2012-08-02 107 views
2

如果我有一个约束为类型'int'的泛型方法,那么当然我应该能够将一个整型转换为泛型T型。例如...C#泛型约束的泛型方法拒绝从整型转换为泛型

public T ExampleMethod<T>(int unchanged) where T : int 
    { 
     return (T)unchanged; 
    } 

...编译器抱怨无法将类型“诠释”到“T”但我有一个约束指示目标是为整数。所以肯定它应该工作?

更新:

的实际情况是,我想返回一个枚举值一个辅助方法。所以,我的理想辅助方法,会更喜欢这个....

public T GetAttributeAsEnum<T>(XmlReader reader, string name) where T : enum 
{ 
    string s = reader.GetAttribute(name); 
    int i = int.Parse(s); 
    return (T)i; 
} 

...并使用它像这样...

StateEnum x = GetAttributeAsEnum<StateEnum>(xmlReader, "State"); 
CategoryEnum y = GetAttributeAsEnum<CategoryEnum>(xmlReader, "Category"); 
OtherEnum z = GetAttributeAsEnum<OtherEnum>(xmlReader, "Other"); 

...但你无法通过枚举约束。

+0

为什么不指定参数类型为'T' ? – gilly3 2012-08-02 04:06:06

+0

我的实际情况比较复杂。我想要一个帮助器方法,从文件中读取一个字符串,该字符串实际上是一个数字。然后将该数字转换为正确的目标枚举类型。所以... – 2012-08-02 04:09:31

+0

这不会编译。错误:'int'不是有效的约束。用作约束的类型必须是接口,非密封类或类型参数。 – 2012-08-02 04:09:49

回答

7

只有类或接口可以被指定为约束。”(三)ReSharper的

INT(Int32)已只是一个结构。你可以限制这个T是结构。但是你不能使用任何结构作为约束。

可能的约束,你可以在这里找到整个列表 - http://msdn.microsoft.com/en-us/library/d5x73970.aspx

UPD

和枚举约束看到这个问题 - Is there a workaround for generic type constraint of "special class" Enum in C# 3.0?

+0

A * struct *也可以用作约束。以下编译:'public class Generic where T:struct {}'。然后,您可以将该类实例化为“Generic gen = new Generic ();'。 – 2012-08-02 04:15:42

+0

@EricJ。你不明白。我们可以将T约束为“一个结构”,但我们不能使用任何结构作为约束。 – 2012-08-02 04:24:19

+0

我明白你来自哪里。然而,现在的答案是误导。除了* struct *之外,您还可以指定* new *作为约束。这两者都不是“阶级或界面”。 – 2012-08-02 04:35:10

4

int(以及所有其他数值类型和枚举)不能用作通用约束。

进一步的细节和选项见

Generic C# Code and the Plus Operator

对于安德斯·海尔斯伯格,C#的创建者的讨论,关于泛型和类型约束看到

http://www.artima.com/intv/generics.html

一个可以放置结构的类型约束是这样的:

public class Generic<T> where T : struct { } 

Generic<int> gen = new Generic<int>(); 
+1

** Downvoter **:这个答案有什么问题?分享,这样我们都可以学习。 – 2012-08-02 04:20:17

2

你确定它的编译?

在这里,它提供了以下错误:

error CS0701: 'int' is not a valid constraint. A type used as a constraint must be an interface, a non-sealed class or a type parameter.