使用switch语句的Class属性值

本文关键字:属性 Class switch 语句 使用 | 更新日期: 2023-09-27 18:11:52

我正在使用生成的protobuf代码(参见http://code.google.com/p/protobuf/)

我有一个生成的类看起来像这样:

public class Fruits{
    private int _ID_BANANA = (int)1;
    private int _ID_APPLE  = (int)2;
    public int ID_BANANA
    {
      get { return _ID_BANANA; }
      set { _ID_BANANA = value; }
    }
    public int ID_APPLE
    {
      get { return _ID_APPLE; }
      set { _ID_APPLE = value; }
    }
}

然后它们是常量值,但我不能在我的代码中使用它们。例如,我想做一个这样的映射器:

public static Color GetColor(int idFruit) {    
    switch (idFruit)
        {
            case new Fruits().ID_BANANA:
                return Color.Yellow;
            case new Fruits().ID_APPLE:
                return Color.Green; 
            default:
                return Color.White;                 
        }
 }

我有错误:期望一个常数值。

我想创建一个enum,但似乎是错误的方式,尝试如下:

public const int AppleId = new Fruits().ID_APPLE;

不工作…有人有主意吗?

使用switch语句的Class属性值

为什么不在这里使用if else if语句?

var fruits = new Fruits();
if (idFruit == fruits._ID_BANANA)
    return Color.Yellow;
else if (idFruit == fruits._ID_APPLE)
    return Color.Green;
else
    return Color.White;

或词典:

this.fruitsColorMap = new Dictionary<int, Color>
    {
        { fruits._ID_BANANA, Color },
        { fruits._ID_APPLE, Green }
    };

然后:

public static Color GetColor(int idFruit) {
    if (this.fruitsColorMap.ContainsKey(idFruit) {
        return this.fruitsColorMap[idFruit];
    }
    return Color.White;
}

switch语句中的case值必须是常量——这是switch语句定义的一部分:

switch (expression)
{
   case constant-expression:
      statement
      jump-statement
   [default:
       statement
       jump-statement]
 }

根据Microsoft的switch (c#)文档。

你会注意到constant-expression位。这意味着它可以在编译时确定。因此,这里不允许调用函数(以及对属性property的引用实际上是伪装的函数调用)。