6

如果我有一个被限制为“int”类型的泛型方法,那么我当然应该能够将整数转换为泛型 T 类型。例如...

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

...编译器抱怨无法将类型“int”转换为“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");

...但你不能通过枚举来限制。

4

3 回答 3

7

只能将类或接口指定为约束。 ” (c) ReSharper

int (Int32) 只是一个结构。您可以将 T 限制为struct。但你不能使用任何结构作为约束。

您可以在此处找到可能的限制的完整列表 - http://msdn.microsoft.com/en-us/library/d5x73970.aspx

UPD

and for Enum constraint see this question - Is there a workaround for generic type constraint of "special class" Enum in C# 3.0?

于 2012-08-02T04:08:19.680 回答
4

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

通用 C# 代码和加号运算符

了解更多详情和选项。

有关与 C# 的创建者 Anders Hejlsberg 关于泛型和类型约束的讨论,请参阅

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

可以像这样放置struct的类型约束:

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

Generic<int> gen = new Generic<int>();
于 2012-08-02T04:06:23.197 回答
2

你确定它的编译?

在这里,它给出了以下错误:

错误 CS0701:“int”不是有效的约束。用作约束的类型必须是接口、非密封类或类型参数。

于 2012-08-02T04:06:49.027 回答