【问题标题】:C# Non-Integer enums and CastingC# 非整数枚举和强制转换
【发布时间】:2012-01-25 02:43:37
【问题描述】:

C# 允许您为枚举元素赋值,例如

public enum Animals
{
    Dog = 0, Cat = 1,
}

你也可以像这样从他们那里投射。

public void demo()
{
    int dog = (int)Animals.Dog;
    Animals cat = (Animals)(dog++);
}

但是 c# 也可以让你做这样的事情

public enum Animals
{
    Dog = Vector2.One, Cat = Vector2.Zero,
}

但是,您无法通过强制转换使 Vector2 重新进出。比如

Vector2 dog = (Vector2)Animals.Dog; //this fails

这个问题可以解决吗? *注意Vector2 是一个类对象,Vector2.OneVector2.Zero 是此类对象的静态声明。这意味着 Dog 被分配给内存引用。

【问题讨论】:

  • 此代码无法编译 - Vector2 必须可转换为 int(或者,如果您指定了任何其他允许的仅整数类型的枚举基本类型)
  • Vector2 不是一个类,它是一个结构和一个值类型(假设您使用的是 XNA Vector2 而不是您自己的实现)。
  • @BrokenGlass 嗯,我的 Kreskin 帽子 (amazingkreskin.com) 也在清洁工那里! ;-)

标签: c# casting enums xna


【解决方案1】:

C# 让你这样做的唯一方法

public enum Animals
{
    Dog = Vector2.One,
    Cat = Vector2.Zero
}

是否存在从 Vector2 到整数类型的隐式转换。否则,你会得到一个编译错误。这就是为什么你不能转换回Vector2 - 没有从int 转换回Vector2DogCat 是整数值,这些值分别来自从 Vector2.OneVector2.Zeroint 的隐式转换。

您可以定义自己的显式转换以使其工作,但我猜您将无法以这种方式取回您想要的所有信息。

【讨论】:

  • 这是真的。它通过了预编译器,而不是编译器。这现在更有意义了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多