Il tipo 'stringa' deve essere un tipo non annullabile per poterlo utilizzare come parametro T nel tipo o metodo generico 'System.Nullable <T>'


172

Perché viene visualizzato l'errore "Il tipo 'stringa' deve essere un tipo di valore non annullabile per poterlo utilizzare come parametro 'T' nel tipo generico o metodo '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; }
      }
    }
}

21
Stringè già nullable.
M.Babcock,

Risposte:


204

Utilizzare stringanziché string?in tutti i punti del codice.

Il Nullable<T>tipo richiede che T sia un tipo di valore non annullabile, ad esempio into DateTime. I tipi di riferimento come stringpossono già essere nulli. Non avrebbe senso permettere cose del genere, Nullable<string>quindi è vietato.

Inoltre, se si utilizza C # 3.0 o versione successiva, è possibile semplificare il codice utilizzando le proprietà implementate automaticamente :

public class WordAndMeaning
{
    public string Word { get; set; }
    public string Meaning { get; set; }
}

1
M.Babcock, quando faccio m_Word = null, errori, suggerimenti? Voglio essere in grado di impostare Word su null.
Varie:

1
@MiscellaneousUser: quale messaggio di errore ricevi? Puoi pubblicare il file esatto che hai provato a compilare? È difficile indovinare quale sia il tuo errore nel vedere solo una riga del tuo codice. Voglio dire, potrebbe darsi che ti stia perdendo un punto e virgola ... ma forse hai semplicemente dimenticato di copiarlo + incollarlo ... Non è altro che congetture finché non pubblichi il codice che hai provato a compilare.
Mark Byers,

Grazie per l'aiuto, ho visto questo post stackoverflow.com/questions/187406/… e posso vedere che il punto interrogativo è solo per i tipi di valore.
Varie:

@MiscellaneousUser: non è solo "per i tipi di valore". Deve essere specificamente un tipo di valore non annullabile . Proprio come dice il messaggio di errore.
Mark Byers,

1
Heh, dopo aver programmato Swift per un po ', questo ha avuto la meglio su di me in un progetto C #.
Albert Bori,

52

stringè un tipo di riferimento, una classe. È possibile utilizzare solo Nullable<T>lo T?zucchero sintattico C # con tipi di valori non annullabili come inte Guid.

In particolare, poiché stringè un tipo di riferimento, un'espressione di tipo stringpuò già essere nulla:

string lookMaNoText = null;

15

System.String (con la S maiuscola) è già nulla, non è necessario dichiararlo come tale.

(string? myStr) è sbagliato.


Piccola modifica alla tua risposta, per evidenziare l'importanza della lettera maiuscola. Sono nuovo di C # e mi ci è sempre voluta questa piccola differenza.
B - rian,

4

Per un motivo molto specifico, digita Nullable<int>il cursore su Nullable e premi F12 - I metadati forniscono il motivo (nota il vincolo struct):

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

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


4
Si noti che ciò Nullable<Nullable<int>>non è consentito anche se si Nullable<int>tratta di una struttura.
Mark Byers,

Interessante. È "codificato" nel compilatore? In che modo è vincolato da una specifica struttura (Nullable <Nullable <... >>)? - Modifica Ora vedo che a quanto pare è speciale - Errore di compilazione ... deve essere un tipo di valore non annullabile ...
Joshua Enfield,

4

Si noti che nella prossima versione di C # che è 8, le risposte non sono vere.

All the reference types are non-nullable by default e puoi effettivamente fare quanto segue:

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

Però,

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

L'importante qui è mostrare l'intento del tuo codice. Se "l'intento" è che il tipo di riferimento può essere nullo, quindi contrassegnarlo in modo che l'assegnazione di un valore null a non annullabile comporterebbe un avviso del compilatore.

Ulteriori informazioni

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.