【问题标题】:Converting enum to uint将枚举转换为 uint
【发布时间】:2016-06-10 07:51:56
【问题描述】:

在以下示例中,当枚举已经是 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
};

【问题讨论】:

  • args.Progress 大概是一个 uint?
  • 好吧,你也可以将 args.Progress 转换为 Values ;) switch ((Values)args.Progress)
  • @BenJackson 是的,我添加了信息
  • @HenrikIlgen 很高兴有另一种方法,因此只需进行一次演员,但这并不能回答原因。

标签: c# windows-phone-8.1


【解决方案1】:

规范: 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!

    这是一个鸡蛋!

    这是一个鸡蛋!

    【讨论】:

      【解决方案3】:

      解决问题的更简洁方法是对 switch 参数进行显式转换,而不是对每个案例进行显式转换,该 switch 语句将向下传播到每个案例块,如下所示。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-21
        • 2021-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多