将枚举转换为uint

问题描述 投票:-1回答:3

在以下示例中,当枚举已经是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
};
c# windows-phone-8.1
3个回答
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或其他任何东西的原因是为了确保你的值适合那里并且它正确地映射到你试图将其投射到的任何变量。使用C代码的DllImport时,它也很重要,它会从头文件映射到常量值。


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!

这是一个鸡蛋!

这是一个鸡蛋!


0
投票

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

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

 public enum Values : uint {
     value1,
     value2 };
© www.soinside.com 2019 - 2024. All rights reserved.