将枚举转换为uint

时间:2016-06-10 07:51:56

标签: c# windows-phone-8.1

为什么在以下示例中枚举已经是uint时我必须转换为uint? : uint甚至还会改变什么吗?如果我删除它,我会得到相同的错误。 args.Progress是一个uint。

switch (args.Progress)
{
    case (uint) Values.value1: // works
        break;
    case Values.value2: // error
        break;
}

public enum Values : uint
{
    value1,
    value2
};

3 个答案:

答案 0 :(得分:5)

规范: uint不会使其成为uint。它仅定义每个成员的类型,但enum仍然是enum

来自枚举定义,如:

public enum Foo : uint
{
    MemberA,
    MemberB
}

编译器(或多或少)创建一个包含常量的类

public class Foo
{
    public const uint MemberA = 0;

    public const uint MemberB = 1;
 }

指定: long或其他任何内容的原因是为了确保您的值适合那里,并且它正确映射到您尝试将其投射到的任何变量。使用DllImport C代码时,将其映射到头文件中的常量值也很重要。

答案 1 :(得分:2)

tl; dr: Valuesuint 不一样,但它可以明确转换。

switch要求两个值(切换的值和它所比较的​​值)属于同一类型(或至少可以隐式转换)。您不能将Enum值隐式转换为相应的整数类型(反之亦然)。出于同样的原因,您无法为Enum类型变量分配整数值:

enum Foo { Spam = 1, Egg = 2, Bar = 4 }

Foo test = 1;

这会导致编译时异常:

  

错误CS0266:无法隐式转换类型' int'到了Foo'。存在显式转换(您是否错过了演员?)

可以做的是将值转换为其他类型:

Foo test = (Foo)1;
int test2 = (int)Foo.Egg;

比较也是如此:

if(test == 1) { Console.WriteLine("It's 1!"); }
  

错误CS0019:运营商' =='不能应用于类型' Foo'的操作数。和' int'

if(test2 == Foo.Egg) { Console.WriteLine("It's an egg!"); }
  

错误CS0019:运营商' =='不能应用于' int'类型的操作数和' Foo'

但是,将其中一个值转换为另一个的类型,它就像一个魅力:

if((int)test == 1) { Console.WriteLine("It's 1!"); }
if(test == (Foo)1) { Console.WriteLine("It's 1!"); }
if((Foo)test2 == Foo.Egg) { Console.WriteLine("It's an egg!"); }
if(test2 == (int)Foo.Egg) { Console.WriteLine("It's an egg!"); }
  

它是1!

     

它是1!

     

它是一个鸡蛋!

     

它是一个鸡蛋!

答案 2 :(得分:0)

解决问题的更干净的方法不是对每种情况都进行显式强制转换,而是对switch参数进行显式强制转换,该switch语句将向下传播到每个case块,如下所示。

 switch ((uint) args.Progress) {
     case Values.value1: // works
         break;
     case Values.value2: // error
         break; }

 public enum Values : uint {
     value1,
     value2 };