Warum kann ich nicht mit dem as-Schlüsselwort für eine Struktur?
Ich definiert mit der folgenden Struktur:
public struct Call
{
public SourceFile caller;
public SourceFile callee;
public Call(SourceFile caller, SourceFile callee)
{
this.caller = caller;
this.callee = callee;
}
}
Später, ich weisen Sie auf die Tag-Eigenschaft eines anderen Objekts:
line.Tag = new Call(sf1, sf2);
Aber wenn ich versuche zum abrufen der Tag-Eigenschaft, etwa so,
Call call = line.Tag as Call;
Visual Studio bietet die folgenden compile-time Fehlermeldung:
Betreiber muss innerhalb einer
Referenz-Typ oder null-Werte zulässt Typ
Was ist der Sinn davon? Und wie kann ich es lösen?
- Warum haben Sie gemacht, dass ein struct? Mutable structs sind eine schlechte Idee.
- Und die Struktur ist erhalten boxed für die Speicherung in einer Tag-Eigenschaft sowieso...
- Hmm es müssen nicht verändert werden. Aber ich denke, ich sollte besser mit uns eine Klasse für diesen Zweck.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine Struktur ist ein Werttyp, so kann es nicht verwendet werden, die mit der
as
Betreiber. Dieas
Betreiber muss in der Lage sein weisen Sie einen Wert von null, wenn der cast fehlschlägt. Dies ist nur möglich mit einem Referenz-Typ oder eine null-Wert-Typ.Gibt es ein paar Möglichkeiten, um dieses Problem zu lösen, aber Ihre beste Wette ist, um ändern Sie Ihre
Call
Typ von einer struct zu einer Klasse. Dies wird im wesentlichen ändern Sie Ihre geben aus Sie einen Werttyp in einen Verweistyp, ermöglicht dieas
Betreiber weisen Sie den Wert null, wenn der cast fehlschlägt.Weitere Informationen zu Werttypen vs. Referenztypen, diese ist eine anständige Artikel. Auch, schauen Sie auf der MSDN-Website:
Einige der vorhandenen Antworten sind nicht ganz Recht. Sie können nicht null- Typen mit
as
, weil das Ergebnisas
ist der null-Wert des Typs, wenn der erste operand ist das nicht eigentlich eines entsprechenden Typs.Jedoch, Sie kann Verwendung
as
mit Wert-Typen... wenn Sie null-Werte zulässt:Damit Sie könnte Verwendung:
Dann können Sie es verwenden als:
Zwei Einschränkungen allerdings:
is
gefolgt von einer BesetzungCall
Typ:Ich würde empfehlen, Sie machen es in einer Klasse statt - an welchem Punkt tritt dieses problem sowieso.
Einen anderen Gedanken: wenn der tag sollte immer ein
Call
ist, dann ist es besser zu wirken:So, wenn die Daten nicht Ihren Vorstellungen entsprechen, (D. H., es gibt einige Fehler, so dass die
Tag
ist nicht einCall
), dann bekommst du es herausfinden frühen, eher als nach Sie haben möglicherweise einige andere arbeiten erledigt. Beachten Sie, dass dieser cast wird sich anders Verhalten, je nachdem, obCall
ist ein struct oder eine Klasse, wennTag
null ist - können Sie werfen einen null-Wert an eine variable eines Referenz-Typs (oder eine null-Wert geben), aber nicht auf einen null-Wert geben.Aus der C# - Spec
Referenzen und nullable-Typen können null sein. Stucts sind value-Typen, so dass Sie kann nicht null sein.
Dies ist eine Einschränkung von C#. Wenn der Typ waren eine Referenz geben, dann, wenn die Darsteller gescheitert, es würde einfach return 'null', aber da es einen Wert geben, der es nicht weiß, was Sie zurückgeben, wenn der cast fehlschlägt.
Müssen Sie ersetzen Ihre Nutzung als mit zwei: 'ist' und 'wie'
Was ist die Bedeutung - Wie erwähnt-Strukturen sind Werttypen.
Wie kann ich es lösen - es zu Ändern
Tag
ist der Typobject
, so muss der code ein cast