Der Typ 'string' muss ein nicht nullbarer Typ sein, um ihn als Parameter T im generischen Typ oder in der generischen Methode 'System.Nullable <T>' zu verwenden.

172

Warum erhalte ich den Fehler "Der Typ 'string' muss ein nicht nullbarer Werttyp sein, um ihn als Parameter 'T' im generischen Typ oder in der generischen Methode 'System.Nullable' zu verwenden"?

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; }
      }
    }
}
VerschiedenesBenutzer
quelle
21
Stringist bereits nullbar.
M.Babcock

Antworten:

204

Verwenden Sie stringstatt string?an allen Stellen in Ihrem Code.

Der Nullable<T>Typ erfordert, dass T ein nicht nullbarer Werttyp ist, zum Beispiel intoder DateTime. Referenztypen wie stringkönnen bereits null sein. Es hätte keinen Sinn, solche Dinge zuzulassen, Nullable<string>so dass es nicht erlaubt ist.

Auch wenn Sie C # 3.0 oder höher verwenden, können Sie Ihren Code mithilfe automatisch implementierter Eigenschaften vereinfachen :

public class WordAndMeaning
{
    public string Word { get; set; }
    public string Meaning { get; set; }
}
Mark Byers
quelle
1
M.Babcock, wenn ich m_Word = null mache, gibt es Fehler, irgendwelche Vorschläge? Ich möchte Word auf null setzen können.
MiscellaneousUser
1
@MiscellaneousUser: Welche Fehlermeldung erhalten Sie? Können Sie die genaue Datei veröffentlichen, die Sie kompilieren wollten? Es ist schwer zu erraten, was Ihr Fehler ist, wenn Sie nur eine Zeile Ihres Codes sehen. Ich meine, es könnte sein, dass Ihnen ein Semikolon fehlt ... aber vielleicht haben Sie einfach vergessen, es zu kopieren und einzufügen ... Es ist nichts als Vermutung, bis Sie den Code veröffentlichen, den Sie kompilieren wollten.
Mark Byers
Vielen Dank für die Hilfe, habe diesen Beitrag stackoverflow.com/questions/187406/… gesehen und kann sehen, dass das Fragezeichen nur für Werttypen ist.
MiscellaneousUser
@MiscellaneousUser: Es ist nicht nur "für Werttypen". Es muss speziell ein nicht nullbarer Werttyp sein. Genau wie die Fehlermeldung sagt.
Mark Byers
1
Heh, nachdem ich Swift eine Weile programmiert hatte, bekam dieser das Beste von mir für ein C # -Projekt.
Albert Bori
52

stringist ein Referenztyp, eine Klasse. Sie können nur verwenden Nullable<T>oder der T?C # syntaktische Zucker mit Nicht-Nullable - Wert - Typen wie intund Guid.

Insbesondere kann stringein Ausdruck vom Typ wie ein Referenztyp stringbereits null sein:

string lookMaNoText = null;
Jon Skeet
quelle
15

System.String (mit Großbuchstaben S) ist bereits nullbar, Sie müssen es nicht als solches deklarieren.

(string? myStr) ist falsch.

Chagbert
quelle
Kleine Bearbeitung Ihrer Antwort, um die Wichtigkeit des Großbuchstabens hervorzuheben. Ich bin neu in C # und habe ewig gebraucht, um diesen kleinen Unterschied zu bekommen.
B - rian
4

Aus einem ganz bestimmten Grund Nullable<int>Geben Sie den Cursor auf Nullable und drücken Sie F12 - Die Metadaten geben den Grund an (beachten Sie die Strukturbeschränkung):

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

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

Joshua Enfield
quelle
4
Beachten Sie jedoch, dass dies Nullable<Nullable<int>>nicht zulässig ist, obwohl Nullable<int>es sich um eine Struktur handelt.
Mark Byers
Das ist interessant. Ist das im Compiler "fest codiert"? Wie wird es von einer bestimmten Struktur eingeschränkt (Nullable <Nullable <... >>)? - Bearbeiten Ich sehe jetzt anscheinend, dass es etwas Besonderes ist - Kompilierungsfehler ... muss ein nicht nullbarer Werttyp sein ....
Joshua Enfield
4

Bitte beachten Sie, dass in der kommenden Version von C #, die 8 ist, die Antworten nicht wahr sind.

All the reference types are non-nullable by default und Sie können tatsächlich Folgendes tun:

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

Jedoch,

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

Das Wichtigste hier ist, die Absicht Ihres Codes zu zeigen. Wenn die "Absicht" ist, dass der Referenztyp null sein kann, markieren Sie ihn, andernfalls würde die Zuweisung eines Nullwerts zu einem nicht nullfähigen Wert zu einer Compilerwarnung führen.

Mehr Info

ANewGuyInTown
quelle