2009-02-27 8 views
19

Tengo una estructura simple que tiene un uso limitado. La estructura se crea en un método que llama a los datos de la base de datos. Si no se devuelven datos de la base de datos, quiero poder devolver un valor nulo, pero Visual Studio se queja, No se puede convertir null en PackageName.StructName porque es un tipo de valor que no admite nulos.Hacer un tipo de valor que no admite nulos. Nulable

¿Cómo puedo convertirlo en nulo?

Respuesta

10
public struct Something 
{ 
    //... 
} 

public static Something GetSomethingSomehow() 
{ 
    Something? data = MaybeGetSomethingFrom(theDatabase); 
    bool questionMarkMeansNullable = (data == null); 
    return data ?? Something.DefaultValue; 
} 
+1

Por lo que yo entiendo, este código no devuelve nulo como Malfist quiere. –

+0

IIRC, tenía la intención de ilustrar el uso de tipos anulables, ya que el póster no parecía entender exactamente lo que eran. – mquander

+0

'predeterminado (Algo)' puede haber sido un mejor valor de retorno predeterminado en el caso de que no exista ningún valor. –

3

Nullable<T> es una clase contenedora que crea una versión anulable del tipo T. También se puede utilizar la sintaxis T? (? Por ejemplo, int) para representar la versión anulable de tipo T.

6

La definición de una estructura Nullable<T> es:

struct Nullable<T> 
{ 
    public bool HasValue; 
    public T Value; 
} 

Se crea de esta manera:

Nullable<PackageName.StructName> nullableStruct = new Nullable<PackageName.StructName>(params); 

Para acceder directamente este lío simplemente escribiendo:

PackageName.StructName? nullableStruct = new PackageName.StructName(params); 

Ver: MSDN

1

Se podría hacer algo anulable, por ejemplo, así:

// Create the nullable object. 
int? value = new int?(); 

// Check for if the object is null. 
if(value == null) 
{ 
    // Your code goes here. 
} 
1

Utilice el built-in atajos para la Nullable<T> estructura, simplemente añadiendo ? a la declaración:

int? x = null; 

if (x == null) { ... } 

Justo lo mismo para cualquier otro tipo, estructura, etc.

MyStruct? myNullableStruct = new MyStruct(params); 
0

Se puede utilizar por defecto como alternativa

public struct VelocityRange 
{ 
    private double myLowerVelocityLimit; 
    private double myUpperVelocityLimit; 
} 

VelocityRange velocityRange = predeterminado (VelocityRange);

Cuestiones relacionadas