2011-09-04 15 views
6

¿Cómo hacer que la siguiente extensión funcione? Estoy vinculando el ComboBoxe a una enumeración y en este caso no se compila porque devuelve null.¿Cómo hacer que un método genérico permita devolver nulo y aceptar enum?

public static T GetSelectedValue<T>(this ComboBox control) 
{ 
    if (control.SelectedValue == null) 
     return null; 

    return (T)control.SelectedValue; 
} 

Nota: Quiero que TE volver nula (en lugar de por defecto (T)). La pregunta es, ¿cuál es la expresión Where que debo usar?

+0

post siguiente responde a su pregunta sobre la devolución nula del método genérico: http://stackoverflow.com/questions/302096/how-can-i-return-null-from-a-generic-method-in-c – Waqas

Respuesta

5

devolver un anulable en lugar de una llanura T:

public static T? GetSelectedValue<T>(this ComboBox control) where T : struct 
{ 
    if (control.SelectedValue == null) 
     return null; 

    return (T)control.SelectedValue; 
} 
5

Eso es imposible. Los tipos de valor no pueden ser nulos. Su método de extensión devuelve una instancia de T y si esta T es una enumeración (tipo de valor), su valor no puede ser nulo. Entonces, sin cambiar el tipo de devolución, la firma de este método simplemente no puede existir. En cuanto a limitar el parámetro genérico para ser una enumeración, eso también es imposible en C# pero posible en MSIL. Jon tiene blogged about it.

+0

what si devolvió el valor predeterminado en lugar de nulo? – Tim

+0

@Tim, por supuesto que funcionará y la forma correcta de escribir este método de extensión pero el OP ya lo sabe porque lo mencionó en su pregunta. Solo traté de explicarle que la firma del método genérico que está tratando de escribir simplemente no puede existir. –

+0

@Darin: Gracias por la respuesta, en mi caso, la sugerencia que fue respondida por Konrad útil. –

1

El enfoque más común en este caso es entre todos los otros miembros de su enumeración definen None, en ese caso en la lógica None == null.

+0

Sí, es útil, creo que está bien simplemente asignando '0' al valor' None' y deja que la extensión devuelva 'default (T)' –

+0

@French Boy: esto es simple y legible, por lo que la forma más natural de resolver eso tipo de problemas – Tigran

Cuestiones relacionadas