C # error de cadena anulable

136
private string? typeOfContract
{
  get { return (string?)ViewState["typeOfContract"]; }
  set { ViewState["typeOfContract"] = value; }
}

Más adelante en el código lo uso así:

typeOfContract = Request.QueryString["type"];

Recibo el siguiente error en la declaración de la typeOfContractlínea que indica:

El tipo 'string' debe ser un tipo de valor no anulable para poder usarlo como parámetro 'T' en el tipo genérico o método 'System.Nullable <T>'

¿Algunas ideas? Básicamente, quiero asegurarme de que "type"exista QueryStringantes de realizar una acción.

Mike Fielden
fuente

Respuestas:

304

System.String es un tipo de referencia y ya "anulable".

Anulable <T> y el? los sufijos son para tipos de valor como Int32, Double, DateTime, etc.

Joe
fuente
13
Una cosa a tener en cuenta: Nullable <T> es un tipo de valor en sí mismo, pero la restricción de tipo genérico "struct" solo incluye tipos de valor no nullable, por lo que no puede hacer Nullable <Nullable <int>>.
Jon Skeet
En C # 8.0, los tipos de referencia pueden marcarse como anulables. Uno puede escribir string?para decirle al mundo que esta cadena puede ser nula. Ref: youtube.com/watch?v=VdC0aoa7ung
nkalfov
39

Lo estás haciendo complicado. stringYa es anulable. No es necesario que sea más anulable. Saque el ?tipo de propiedad.

jop
fuente
19

string no puede ser el parámetro para Nullable porque string no es un tipo de valor. La cadena es un tipo de referencia.

string s = null; 

es una declaración muy válida y no es necesario que sea anulable.

private string typeOfContract
    {
      get { return ViewState["typeOfContract"] as string; }
      set { ViewState["typeOfContract"] = value; }
    }

debería funcionar debido a la palabra clave as .

Szymon Rozga
fuente
13

La cadena es un tipo de referencia, por lo que no necesita (y no puede) usar Nullable<T>aquí. Simplemente declare typeOfContract como cadena y simplemente verifique que sea nulo después de obtenerlo de la cadena de consulta. O use String.IsNullOrEmpty si desea manejar valores de cadena vacíos iguales a nulos.

csgero
fuente
4

Para nulos, use ?con todas las primitivas de C # , excepto la cadena.

La siguiente página ofrece una lista de las primitivas de C # : http://msdn.microsoft.com/en-us/library/aa711900(v=vs.71).aspx

James Oravec
fuente
1
Link is Broken Gracias
Mina Gabriel
Gracias Mina, encontré un enlace diferente y actualicé la referencia.
James Oravec
1
No solo primitivas, todos los tipos de valores no anulables (que no son manejados especialmente por .NET) funcionan.
IllidanS4 quiere que Mónica regrese el
0

Tenga en cuenta que en la próxima versión de C #, que es 8, las respuestas no son ciertas.

All the reference types are non-nullable by default y puedes hacer lo siguiente:

public string? MyNullableString; 
this.MyNullableString = null; //Valid

Sin embargo,

public string MyNonNullableString; 
this.MyNonNullableString = null; //Not Valid and you'll receive compiler warning. 

Lo importante aquí es mostrar la intención de su código. Si la "intención" es que el tipo de referencia puede ser nulo, márquelo para que, de lo contrario, asignar un valor nulo a no anulable resulte en una advertencia del compilador.

Más información

Para el moderador que está eliminando todas las respuestas, no lo haga. Creo firmemente que esta respuesta agrega valor y eliminar simplemente evitaría que alguien sepa qué es lo correcto en ese momento. Como ha eliminado todas las respuestas, vuelvo a publicar la respuesta aquí. El enlace que se envió con respecto a "duplicados" es simplemente una apertura de algunas personas y no creo que sea una recomendación oficial.

ANewGuyInTown
fuente