【问题标题】:C# generic method with integer constraint refuses to cast from integer to the generic type具有整数约束的 C# 泛型方法拒绝从整数转换为泛型类型
【发布时间】:2012-08-02 13:00:14
【问题描述】:

如果我有一个被限制为“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");

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

【问题讨论】:

  • 为什么不直接指定参数类型为T
  • 我的真实情况比较复杂。我想要一个从文件中读取字符串的辅助方法,该字符串实际上是一个数字。然后将数字转换为正确的目标枚举类型。所以...
  • 这不会编译。错误:“int”不是有效的约束。用作约束的类型必须是接口、非密封类或类型参数。
  • 如果T 总是 int 那么为什么要使用泛型呢?
  • public T Method(XmlReader reader) where T : enum { string s = reader.GetAttribute("whatever"); int i = int.Parse(s);返回 (T)i; }

标签: c# generics


【解决方案1】:

"只能将类或接口指定为约束。" (c) 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?

【讨论】:

  • A struct 也可以用作约束。以下编译:public class Generic&lt;T&gt; where T : struct { }。然后您可以将该类实例化为Generic&lt;int&gt; gen = new Generic&lt;int&gt;();
  • @EricJ。你不明白。我们可以将 T 约束为“结构体”,但我们不能使用任何结构体作为约束。
  • 我知道你来自哪里。但是,就目前而言,您的回答具有误导性。除了 struct 之外,您还可以指定 new 作为约束。这些都不是“类或接口”。
【解决方案2】:

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

Generic C# Code and the Plus Operator

了解更多详情和选项。

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

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

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

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

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

【讨论】:

  • Downvoter:这个答案有什么问题?分享给大家,让大家一起学习。
【解决方案3】:

你确定它正在编译吗?

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多