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

172

¿Por qué obtengo el error "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'"?

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using Universe;

namespace Universe
{
    public class clsdictionary
    {
      private string? m_Word = "";
      private string? m_Meaning = "";

      string? Word { 
          get { return m_Word; }
          set { m_Word = value; }
      }

      string? Meaning { 
          get { return m_Meaning; }
          set { m_Meaning = value; }
      }
    }
}
Usuario misceláneo
fuente
21
StringYa es anulable.
M.Babcock

Respuestas:

204

Use en stringlugar de string?en todos los lugares de su código.

El Nullable<T>tipo requiere que T sea un tipo de valor no anulable, por ejemplo into DateTime. Los tipos de referencia como stringya pueden ser nulos. No tendría sentido permitir cosas así, Nullable<string>por lo que no se permite.

Además, si está utilizando C # 3.0 o posterior, puede simplificar su código utilizando propiedades implementadas automáticamente :

public class WordAndMeaning
{
    public string Word { get; set; }
    public string Meaning { get; set; }
}
Mark Byers
fuente
1
M.Babcock, cuando hago m_Word = null, errores, ¿alguna sugerencia? Quiero poder configurar Word para que sea nulo.
MiscellaneousUser
1
@ Usuario Misceláneo: ¿Qué mensaje de error recibes? ¿Puedes publicar el archivo exacto que intentaste compilar? Es difícil adivinar cuál es su error al ver solo una línea de su código. Quiero decir que podría ser que te falta un punto y coma ... pero tal vez olvidaste copiarlo y pegarlo ... No es más que conjeturas hasta que publicas el código que intentaste compilar.
Mark Byers
Gracias por la ayuda, vi esta publicación stackoverflow.com/questions/187406/… y puedo ver que el signo de interrogación es solo para los tipos de valor.
MiscellaneousUser
@Mis MiscellaneousUser: no es solo "para tipos de valor". Debe ser específicamente un tipo de valor no anulable . Justo como dice el mensaje de error.
Mark Byers
1
Je, después de programar Swift por un tiempo, este obtuvo lo mejor de mí en un proyecto de C #.
Albert Bori
52

stringes un tipo de referencia, una clase. Solo puede usar Nullable<T>el T?azúcar sintáctico C # con tipos de valores no anulables como inty Guid.

En particular, como stringes un tipo de referencia, una expresión de tipo stringya puede ser nula:

string lookMaNoText = null;
Jon Skeet
fuente
15

System.String (con mayúscula S) ya es anulable, no necesita declararlo como tal.

(string? myStr) Está Mal.

Chagbert
fuente
Pequeña edición a su respuesta, para resaltar la importancia de la letra mayúscula. Soy nuevo en C # y me tomó para siempre obtener esta pequeña diferencia.
B - rian
4

Por una razón muy específica, escriba Nullable<int>su cursor en Nullable y presione F12: los metadatos proporcionan la razón (tenga en cuenta la restricción de estructura):

public struct Nullable<T> where T : struct
{
...
}

http://msdn.microsoft.com/en-us/library/d5x73970.aspx

Joshua Enfield
fuente
44
Tenga en cuenta que eso Nullable<Nullable<int>>no está permitido aunque Nullable<int>sea ​​una estructura.
Mark Byers
Eso es interesante. ¿Está "codificado" en el compilador? ¿Cómo se limita desde una estructura específica (Nullable <Nullable <... >>)? - Editar Ahora veo que aparentemente es especial - Error de compilación ... debe ser un tipo de valor no anulable ...
Joshua Enfield
4

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

ANewGuyInTown
fuente