Si no desea analizar cadenas, pero desea asegurarse de que recibe cualquiera null
, un decimal
o anulable decimal
, entonces se podría hacer algo como esto:
public static Nullable<T> Convert<T>(object input)
where T : struct
{
if (input == null)
return null;
if (input is Nullable<T> || input is T)
return (Nullable<T>)input;
throw new InvalidCastException();
}
Usted podría haga que devuelva nulo en la última línea en su lugar si desea evitar excepciones, aunque esto no distinguiría entre valores nulos reales y malos lanzamientos.
Tenga en cuenta que debe utilizar el operador "es", ya que el operador "como" no funciona en los tipos de valores, y la conversión sin comprobación puede arrojar una InvalidCastException.
También puede hacer que sea un método de extensión:
public static class ObjectExtensions
{
public static Nullable<T> ToNullable<T>(this object input)
where T : struct
{
if (input == null)
return null;
if (input is Nullable<T> || input is T)
return (Nullable<T>)input;
throw new InvalidCastException();
}
}
Y utilizar de esta manera:
object value = 123.45m;
decimal? dec = value.ToNullable<decimal>();
Esto ayudará a evitar las advertencias sobre los contratos código de referencias nulas unboxing.
No utilizaría la palabra "idéntico" aquí.Por ejemplo, puede desagrupar entre los tipos enum y su tipo subyacente, T y T ?, y algunos otros casos extraños IIRC. El CLR es más permisivo de lo que uno podría esperar. –
(Pero sí, no debe esperar que unboxing analice una cadena :) –
@Jon: ¿tiene una mejor formulación? Sin eso, voy a copiar tu comentario en mi respuesta porque expresa la advertencia muy bien. –