无法将第二个枚举值转换为int?

时间:2010-02-08 14:16:22

标签: c#

我不懂。我能够将我的第一个枚举值转换为int而不是第二个?

public enum PayPalTransactionType
{
    Authorization = 0, // Debit
    Capture = 1, // Credit
    Refund = 2,
    Void = 3
}

public string GetPayPalTransCode(PayPalServiceBase.PayPalTransactionType payPalTransactionType)
{
    string actionCode = string.Empty;

    switch (payPalTransactionType)
    {
        case (int)PayPalServiceBase.PayPalTransactionType.Authorization:
            actionCode = "Debit";
            break;
        case (int)PayPalServiceBase.PayPalTransactionType.Capture:
            actionCode = "Credit";
            break;
    }

    return actionCode;
}

在我的第二个案例陈述中我得到了这个投射错误:

  

无法隐式转换类型int   到PayPalTransactionType。一个   存在显式转换(是吗?   错过演员?)

10 个答案:

答案 0 :(得分:11)

你为什么要在第一时间施展?只需将它作为枚举值保留在任何地方:

public string GetPayPalTransCode
    (PayPalServiceBase.PayPalTransactionType payPalTransactionType)
{
    string actionCode = string.Empty;

    switch (payPalTransactionType)
    {
        case PayPalServiceBase.PayPalTransactionType.Authorization:
            actionCode = "Debit";
            break;
        case PayPalServiceBase.PayPalTransactionType.Capture:
            actionCode = "Credit";
            break;
    }

    return actionCode;
}

此外,我对未识别的代码有明确的默认操作,只是直接返回:

public string GetPayPalTransCode
    (PayPalServiceBase.PayPalTransactionType payPalTransactionType)
{
    switch (payPalTransactionType)
    {
        case PayPalServiceBase.PayPalTransactionType.Authorization:
            return "Debit";
        case PayPalServiceBase.PayPalTransactionType.Capture:
            return "Credit";
        default:
            return ""; // Or throw an exception if this represents an error
    }
}

或者,您可以使用Dictionary<PayPalTransactionType, string>

答案 1 :(得分:6)

你为什么要投奔int?你switch的东西已经是枚举类型了!

答案 2 :(得分:4)

关于问题的另一部分,第一个强制转换工作的原因是因为从常量int 0到枚举类型的隐式转换始终有效,而另一个尝试强制转换来自非零int值。

答案 3 :(得分:2)

为什么上帝的缘故你在做演员?

public string GetPayPalTransCode(PayPalServiceBase.PayPalTransactionType payPalTransactionType)
{
    switch (payPalTransactionType)
    {
        case (int)PayPalServiceBase.PayPalTransactionType.Authorization:
            break;
        case (int)PayPalServiceBase.PayPalTransactionType.Capture:
            break;
    }
}

这里的基本相同类型,不是吗?!你想比较enum和enum,不是吗?

只是做

public string GetPayPalTransCode(PayPalServiceBase.PayPalTransactionType payPalTransactionType)
{
    // ...
    switch (payPalTransactionType)
    {
        case PayPalServiceBase.PayPalTransactionType.Authorization:
            break;
        case PayPalServiceBase.PayPalTransactionType.Capture:
            break;
    }
    // ...
}

btw - 将PayPalTransactionType.Authorization分配给0并非最佳做法。 0应该用于解析后备!

修改
如果你这样做,你的代码就是正确的

public string GetPayPalTransCode(PayPalServiceBase.PayPalTransactionType payPalTransactionType)
{
    switch ((int)payPalTransactionType)
    {
        case (int)PayPalServiceBase.PayPalTransactionType.Authorization:
            break;
        case (int)PayPalServiceBase.PayPalTransactionType.Capture:
            break;
    }
}

非常......!

答案 4 :(得分:1)

删除案例陈述中的(int)强制转型。交换机可以处理枚举值。

由于开关是“PayPalTransactionType”,因此应在case语句中使用该类型的值。

答案 5 :(得分:0)

您首先不需要这些演员阵容。只需将其case PayPalServiceBase.PayPalTransactionType.Authorization等等。

答案 6 :(得分:0)

为什么首先将它转换为int。?只需使用枚举类型执行case语句。

如果你真的只是查找一个字符串,一个更好的方法是一个字符串数组,你可以通过枚举类型进行索引。这将更快,代码更少,更易于维护。

这样的事情:

public enum PayPalTransactionType
{
  Authorization = 0, // Debit 
  Capture = 1, // Credit 
  Refund = 2,
  Void = 3,
  Max  // This must always be the last type and is used just as a marker.
}
string[] ActionCode = new string[(int)PayPalTransactionType.Max] { "Debit", "Credit", "Refund", "Void" };


public string GetPayPalTransCode(PayPalTransactionType payPalTransactionType)
{
  return ActionCode[(int)payPalTransactionType];
} 

答案 7 :(得分:0)

您不需要演员int。只需直接使用枚举。

switch (payPalTransactionType)
{
    case PayPalServiceBase.PayPalTransactionType.Authorization:
        actionCode = "Debit";
        break;
    case PayPalServiceBase.PayPalTransactionType.Capture:
        actionCode = "Credit";
        break;
}

发生错误是因为您尝试隐式payPalTransactionType转换为int。也许这会启发你的问题:

switch ((int)payPalTransactionType)
{
    case (int)PayPalServiceBase.PayPalTransactionType.Authorization:
        actionCode = "Debit";
        break;
    case (int)PayPalServiceBase.PayPalTransactionType.Capture:
        actionCode = "Credit";
        break;
}

第一次演员会让您switch而不是intPayPalTransactionType。由于switch语句支持枚举,因此不需要此强制转换。

答案 8 :(得分:0)

我不是Java / C#专家,但这是我在上面的代码块上的2美分......

  1. 如果你正在使用枚举,为什么你需要有一个int值,如果你这样做,那么做一些像:

    public enum PayPalTransactionType {     授权(0,借记),     捕获(1,信用),     退款(3,null),     无效(4. null);

    private final int code;
    
    public int getCode()
    {return(code);}
    
    private PayPalTransactionType(final int code, final TransactionType transactionType)
    {
       this.code = code;
       this.transactionType = transactionType;
    }
    
    private TransactionType getTransactionType()
    {return(transactionType);}
    

    }

  2. public enum TransactionType {    信用(“资金被添加到指定的帐户。”),    借记(“资金从指定账户中扣除。”);

    private final String description;

    public String getDescription()    {返回(介绍);}

    私有TransactionType(最终字符串描述)    {this.description = description;} }

    1. 开关对于极少数情况很有用。你可以这样做:

      final PayPalTransactionType payPalTransactionType = PayPalTransactionType.Authorization; //这只是您要传递的参数的一个示例。

      payPalTransactionType.getTransactionType(); // emum是一个静态数据库,只存储与此值相关的其他内容。

    2. 沃尔特

答案 9 :(得分:0)

这不是向你提出问题的演员。它将(int)PayPalServiceBase.PayPalTransactionType.Capture(这是一个int)转换回PayPalServiceBase.PayPalTransactionType,这就是问题所在。