为什么在以下示例中枚举已经是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
};
答案 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: Values
和uint
不一样,但它可以明确转换。
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 };