2010-01-19 32 views
9

¿Cómo puedo obtener 0 como valor de número entero de (int)null.quiero "(int) null" para mí devolver 0

EDIT 1: Quiero crear una función que me devuelva los valores predeterminados para la representación nula en sus respectivos tipos de datos.

EDIT 2: ¿Cómo puedo trabajar en este escenario para el uso por defecto .

(int) Valor

Dónde valor puede ser nulo o cualquier valor entero. No sé el tipo de datos de valor en tiempo de ejecución. Pero me aseguraré de que Value solo contenga valor nulo o entero.

Respuesta

21

Puede utilizar la estructura anulable

int value = new Nullable<int>().GetValueOrDefault(); 

También puede utilizar el default palabra clave

int value = default(int); 

Siguiendo segunda edición:

Se necesita una función que recibe ningún tipo de parámetro, entonces el objeto será usado.Su función es similar al método Field<T> extensión en un DataRow

public static T GetValue<T>(object value) 
{ 
    if (value == null || value == DBNull.Value) 
     return default(T); 
    else 
     return (T)value; 
} 

El uso de esa función, si quieres un int (y esperas valor a ser un int) se llame gustaría:

int result = GetValue<int>(dataRow["Somefield"]); 
+0

Estoy de acuerdo. No es necesario reinventar la rueda, use la característica de lenguaje de compilación, los tipos anulables. –

+0

@ Pierre-Alain Vigeant: Necesita más explicación sobre "nuevo Nullable () .GetValueOrDefault();" sobre qué y cómo funciona Me confunde un poco usando no sé acerca de este tipo de código de sintaxis –

+4

@ShantanuGupta Un tipo anulable como 'int?' Proporciona un método llamado GetValueOrDefault(). Este método devuelve el valor si no es nulo o el valor predeterminado del tipo (0 para un int) si el valor es nulo. –

0

No se puede lanzar un null a un int, como un int es un tipo de valor. Usted puede echarlo a un int? sin embargo.

¿qué es lo que quiere lograr?

+0

@thecoop: Estoy tratando de hacer una función general para devolverme los valores predeterminados para todos los tipos de datos. –

34

Se puede utilizar la palabra clave default para obtener el valor por defecto de cualquier tipo de datos:

int x = default(int);  // == 0 
string y = default(string); // == null 
// etc. 

Esto funciona con parámetros genéricos, así:

Bar<T> Foo<T>() { 
    return new Bar<T>(default(T)); 
} 

En caso de que tenga una variable de tipo object que puede contener null o un valor de tipo int, puede utilizar nullable types y la ?? operator para convertir de forma segura a un entero:

int a = 42; 
object z = a; 
int b = (int?)z ?? 0;  // == 42 
int c = (int?)null ?? 0;  // == 0 
+3

+1: y tampoco es necesario que sea una función propia. –

+1

+1 para el ?? operador. –

+0

+1, no sabía acerca de la palabra clave predeterminada. – iandisme

1

Un método genérico que devuelve una instancia de conversión de un objeto o el valor predeterminado podría implementarse de la siguiente manera:

static T Cast<T>(object value) { 
    if (value is T) 
     return (T)value; 
    else 
     return default(T); 
} 

De esta manera, utilizando un valor válido producirá el valor en sí:

int value = Cast<int>(4); //value = 4 

y un valor nulo obtendrá el valor por defecto:

int value = Cast<int>(null); //value = 0 

en cuenta que dado que el método tiene objeto como un argumento , esto causará el boxeo cuando se usa con objetos struct (como int).

0

un método de una clase genérica que devuelve nada funciona:

Class GetNull(Of T) 
     Public Shared Function Value() As T 
      Return Nothing 
     End Function 
End Class 



Debug.Print(GetNull(Of Integer).Value()) 
0

Usted necesitará un tipo de retorno de Nullable(Of Integer).

Cuestiones relacionadas