573 Stimmen

Welchen Zweck hat ein Fragezeichen nach einem Typ (zum Beispiel: int? myVariable)?

In der Regel wird das Fragezeichen hauptsächlich für das Konditional verwendet, x ? "yes" : "no" .

Aber ich habe eine andere Verwendung gesehen, kann aber keine Erklärung für diese Verwendung des ? Operator, zum Beispiel.

public int? myProperty
{
   get;
   set;
}

3 Stimmen

Es gibt entsprechende Fragen für Referenztyp - stackoverflow.com/questions/69433546/

1 Stimmen

Er verweist darauf, dass der Wertetyp (hier int?) ein nullbarer Typ ist.

6voto

Nicola Amadio Punkte 141

int? ist die Kurzform für Nullable<int> . Die beiden Formen sind austauschbar.

Nullable<T> ist ein Operator, den Sie mit einem Werttyp verwenden können T um es zu akzeptieren null .

Falls Sie es noch nicht wissen: Werttypen sind Typen, die Werte als int , bool , char usw...

Sie können keine Referenzen auf Werte akzeptieren: Sie würden einen Kompilierfehler erzeugen, wenn Sie ihnen eine null im Gegensatz zu Referenztypen die es offensichtlich akzeptieren kann.

Warum sollten Sie das brauchen? Weil Ihre Wertvariablen manchmal Nullreferenzen erhalten könnten, die von etwas zurückgegeben werden, das nicht sehr gut funktioniert, wie eine fehlende oder undefinierte Variable, die von einer Datenbank zurückgegeben wird.

Ich empfehle Ihnen die Lektüre der Microsoft-Dokumentation weil sie das Thema sehr gut abdeckt.

0 Stimmen

Wenn die beiden Formen austauschbar sind, wie kommt es dann, dass die eine einen Kompilierzeitfehler verursacht und die andere nicht? Vergleichen Sie public Item? item { get; set; }; con public Nullable<Item> item { get; set; }; wobei Item eine triviale Klasse ist.

1 Stimmen

@MattiasMartens Item muss ein Werttyp (eine Struktur) sein - Klassen sind Referenztypen. Ein nullbarer Referenztyp ist etwas ganz anderes leider mit identischer Syntax, was zu einiger Verwirrung führt.

6voto

lucaspompeun Punkte 97

Bedeutet, dass die mit (int?) deklarierte Variable nullbar ist

int i1=1; //ok
int i2=null; //not ok

int? i3=1; //ok
int? i4=null; //ok

1voto

Ergänzend zu den obigen Antworten finden Sie hier ein Codebeispiel

struct Test
{
    int something;
}
struct NullableTest
{
    int something;
}
class Example
{
    public void Demo()
    {
        Test t = new Test();
        t = null;

        NullableTest? t2 = new NullableTest();
        t2 = null;
    }
}

Dies würde zu einem Kompilierungsfehler führen:

Fehler 12 Kann nicht in 'Test' konvertiert werden, da es sich um einen nicht-nullbaren Wert handelt Werttyp

Beachten Sie, dass es keinen Kompilierungsfehler für NullableTest gibt. (beachten Sie das ? in der Deklaration von t2)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X