【问题标题】:How can I return a primitive from a method with a generic return type?如何从具有通用返回类型的方法返回原语?
【发布时间】:2014-07-15 07:37:32
【问题描述】:

在我的代码中,我有一个通用的“getProperty”,如下所示:

public T getProperty<T>(int GUID, string property)
{
    PropertyComponent prop;
    prop = propDict[GUID];
    if(property.Equals("visible")) return (T) (Boolean) prop.visible;
    if(property.Equals("enabled")) return prop.enabled;
    if(property.Equals("position")) return (T) (Object) prop.position;
}

Visual Studio 的编译器在第三学期没有给我任何错误,因为 prop.position 是 Vector2。然而,Prop.visible 和 prop.enabled 是 bool ,所以当我尝试以这种方式返回它们时,我会收到“无法将 bool 类型转换为 T”的错误(以及“无法将 bool 类型隐式转换为 T”的错误第二个)。

在这种情况下返回布尔值的正确方法是什么?

【问题讨论】:

  • (T)(object) 是所有 3 个术语的正确转换。
  • @Marc 所以答案是,“你不能使用原语”?

标签: c# generics


【解决方案1】:

您可以将泛型类型参数限制为类或结构(使用 where 子句),但在您的示例中,您将 T 类型同时视为类和结构(布尔值类型)。

如果要返回引用类型对象实例以及值类型数据(如 bool),则必须将值类型“装箱”到对象中,因为引用类型对象是两者之间唯一的共同点引用类型和值类型。当您将值类型类型转换为 Object 时,装箱会自动发生。所以,你所有的返回值都应该转换成(T)(object)

【讨论】:

  • 所以解决方案是不要尝试使用原语;把我所有的bools 变成Booleans。明白了。
  • @RavenDreamer boolBoolean 相同——bool 关键字只是System.Boolean 的别名。
  • @phoog 你确定吗? Visual Studio 只让(T) (Object) prop.visible 在我从前者改成后者后编译。
  • @RavenDreamer 是的,我确定。请注意,编译的语句既不包含“bool”也不包含“Boolean”,因此无法识别两者之间的任何区别。试试这个:Console.WriteLine(typeof(bool) == typeof(Boolean));
猜你喜欢
  • 2013-05-11
  • 1970-01-01
  • 2014-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多