2010-02-08 19 views
5

No entiendo esto. ¿Pude lanzar mi primer valor enum a int pero no al segundo?No se puede convertir el 2º valor de Enum a 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; 
} 

en mi estado segundo caso me sale este error de calidad:

Cannot implicitly convert type int to PayPalTransactionType . An explicit conversion exists (are you missing a cast?)

+0

Por favor, edite su pregunta para poner todo el código en un bloque de código, es confuso en este momento.Gracias –

+0

@Marcel: se hace – AakashM

+2

¿Por qué estás convirtiendo el 'enum' a un' int' en las declaraciones de tu caso? En realidad, no necesita lanzarlos en absoluto. –

Respuesta

11

¿Por qué está tratando de lanzar en primer lugar? Sólo tienes que dejar que el valor de enumeración en todas partes:

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; 
} 

Además, tendría una acción predeterminada explícita para los códigos no reconocidos, y acaba de regresar directamente:

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 
    } 
} 

Alternativamente, se puede utilizar un Dictionary<PayPalTransactionType, string>.

2

por qué, por Dios estás haciendo un reparto ??

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

bascialmente el mismo tipo de aquí, ¿no ?! quieres comparar enum contra enum, ¿verdad?

Eso sí,

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

por cierto - no es la mejor práctica para asignar a PayPalTransactionType.Authorization0. 0 se debe utilizar para análisis de retroceso.

edición:
su código sería correcto si lo hace

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

que es bastante ...!

0

No necesita estos modelos en primer lugar. Simplemente haga que sea case PayPalServiceBase.PayPalTransactionType.Authorization, etc.

6

¿Por qué está lanzando a int en absoluto? ¡Lo que está switch encendido ya es del tipo enum!

0

¿Por qué lo estás lanzando a un int en primer lugar.? Solo haga las declaraciones de casos usando el tipo enumerado.

Si realmente está buscando una cadena, un método mejor sería una matriz de cadenas que indexe por el tipo enumerado. Eso sería más rápido, menos código y más fácil de mantener.

Así que algo como esto:

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]; 
} 
1

Retire la (int) arroja en sus estados de cuenta de casos. El interruptor puede manejar los valores enum.

Dado que el interruptor está en `PayPalTransactionType', valores de ese tipo debe ser utilizado en las declaraciones de casos.

4

En cuanto a la otra parte de la pregunta, la razón por la que funciona el primer elenco es porque siempre funciona un lanzamiento implícito de una constante int 0 a un tipo enum, mientras que el otro intento de conversión es de un valor int no nulo .

0

No necesita los moldes a int. Solo usa la enumeración directamente.

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

El error se produce porque su tratando de implícitamente convertir payPalTransactionType a int. Tal vez esto se ilumine su problema:

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

Este primer molde que permite a switch en int s en lugar de PayPalTransactionType s. Como la instrucción switch admite enumeraciones, no necesita este molde.

0

Tim,

No soy un/C# experto en Java, pero aquí es mi 2 centavos en el bloque de código anterior ...

  1. Si está utilizando una enumeración, ¿por qué es necesario tener un valor int, si lo hace, a continuación, hacer algo como:

    enumeración pública PayPalTransactionType { Autorización (0, débito), Captura (1, crédito), reembolso (3, null), Void (4. nulo);

    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);} 
    

    }

enumeración pública TransactionType { de crédito ("Los fondos se añaden a la cuenta especificada."), débito ("Los fondos se deducen de la cuenta especificada.");

private final Descripción de la cadena;

getDescription cadena pública() {return (descripción);}

TransactionType privada (descripción final String) { this.description = descripción;}}

  1. Los interruptores son útiles para una cantidad muy pequeña de casos. Usted puede simplemente hacer esto:.

    última PayPalTransactionType payPalTransactionType = PayPalTransactionType.Authorization; // Esto es sólo un ejemplo de los parámetros que estaría pasando en

    payPalTransactionType.getTransactionType(); // un emum es una base de datos estática, simplemente almacene otras cosas relacionadas con este valor.

Walter

0

No es el reparto a int que te está dando un problema. Es el elenco de (int)PayPalServiceBase.PayPalTransactionType.Capture (que es un int) de nuevo a PayPalServiceBase.PayPalTransactionType ese es el problema.

Cuestiones relacionadas