2009-05-29 22 views
10

Así que tienen algo como estoque vuelven tipos de cadenas anulables

public string? SessionValue(string key) 
{ 
    if (HttpContext.Current.Session[key].ToString() == null || HttpContext.Current.Session[key].ToString() == "") 
     return null; 

    return HttpContext.Current.Session[key].ToString(); 
} 

que no compila.

¿Cómo devuelvo un tipo de cadena que se puede anular?

Respuesta

30

Cadena ya es un tipo que admite nulo. Nullable solo se puede usar en ValueTypes. String es un tipo de referencia.

Deshazte del "?" y deberías ser bueno para ir!

0

Puede asignar null a una cadena ya que es un tipo de referencia, no necesita poder anularla.

0

Cadena ya es un tipo que admite nulo. No necesitas el '?'.

Error 18 El tipo 'cadena' debe ser un tipo valor no anulable con el fin de utilizan como parámetro de 'T' en el tipo genérico o método 'System.Nullable'

-1

string ya se puede anular por sí mismo.

4

Como todo el mundo ha dicho, string no necesita ? (que es un acceso directo para Nullable<string>) porque todos los tipos de referencia (en) class ya están anulable. Solo se aplica al tipo de valor (struct s).

Aparte de eso, no debe llamar ToString() en el valor de la sesión antes de comprobar si se trata de null (o se puede obtener una NullReferenceException). Además, no debería tener que verificar el resultado de ToString() para null porque nunca debe devolver null (si está implementado correctamente). ¿Y está seguro de que desea devolver null si el valor de la sesión es string ("") vacío?

Esto es equivalente a lo que quería escribir:

public string SessionValue(string key) 
{ 
    if (HttpContext.Current.Session[key] == null) 
     return null; 

    string result = HttpContext.Current.Session[key].ToString(); 
    return (result == "") ? null : result; 
} 

Aunque lo escribiría así (tornó vacía string si eso es lo que el valor de sesión contiene):

public string SessionValue(string key) 
{ 
    object value = HttpContext.Current.Session[key]; 
    return (value == null) ? null : value.ToString(); 
} 
+0

"porque todos los tipos de referencia (clases) ya pueden contener nulos ". -> No parece ser así. 'public class vector {public static vector func() {return null; }} 'da como resultado un error. – Assimilater

+0

Las interfaces parecen nullable siempre – Assimilater

+0

@Assimilater Acabo de probar su código. Se compiló y funcionó muy bien para mí. 'vector' es una clase, por lo que' func() 'definitivamente puede devolver' null'. – Lucas

Cuestiones relacionadas