Warum kann eine Eigenschaft nicht als out-Parameter übergeben werden?

9

Zum Beispiel:

%Vor%

Aus der Microsoft-Dokumentation heißt es:

"Eine als out-Argument übergebene Variable muss nicht initialisiert werden. Dem out-Parameter muss jedoch ein Wert zugewiesen werden, bevor die Methode zurückkehrt."

und dann:

"Eine Eigenschaft ist keine Variable und kann nicht als out-Parameter übergeben werden.

Also, was war die Argumentation im zugrunde liegenden .net-Plattform-Design zu verbieten, eine Eigenschaft eines Objekts über das Out zu setzen? Der Wert von out muss auch kein Referenzobjekt sein - es ist völlig legitim, einen Werttyp zu verwenden. Also warum nicht?

    
dexter 27.01.2011, 17:18
quelle

5 Antworten

14

Dies ist in VB gültig, aber nicht in C # ... VB erstellt effektiv eine temporäre lokale Variable für Sie, ruft die Methode auf, die die lokale Variable als Argument übergibt, und legt dann die Eigenschaft mit dem Wert der lokalen Variablen fest . C # versteckt solche Dinge normalerweise nicht für dich.

Die Methode selbst benötigt als Parameter out eine Variable . Es muss einen Speicherort haben, an den es Werte schreiben kann. Keine Eigenschaft, nichts, was aufgerufen werden muss: nur ein Speicherort. Eine Eigenschaft erfüllt diese Anforderung nicht. Es gibt also nichts, was der Compiler in der Methode tun kann, um dies zu ermöglichen.

Entweder muss der Compiler es mit einer temporären Variable nach VB vortäuschen oder es gemäß C # ablehnen. Persönlich bevorzuge ich den C # -Ansatz - andernfalls sieht so aus , als ob jedes Mal, wenn die Methode dem out-Parameter einen Wert zuordnet, die Eigenschaft gesetzt würde - was sicherlich nicht der Fall ist.

    
Jon Skeet 27.01.2011, 17:25
quelle
9

Eine Eigenschaft ist nur ein Paar Funktionen namens get_Something und set_Something .
Ein out -Parameter nimmt einen Verweis auf ein Feld oder eine Variable; es würde keinen Sinn machen, ein paar Funktionen zu übergeben.

VB.Net kann Eigenschaften als übergeben ByRef -Parameter ; Der Compiler generiert eine temporäre Variable und weist die Variable nach dem Aufruf der Methode erneut der Variablen zu.

Aber selbst VB.Net kann Ihren Fall nicht behandeln, weil die Eigenschaft Nullable<T>.Value schreibgeschützt ist.

    
SLaks 27.01.2011 17:21
quelle
2

Weil eine Eigenschaft syntaktischer Zucker für eine get - und eine set -Methode ist, die vom Compiler generiert werden.

    
Klaus Byskov Pedersen 27.01.2011 17:22
quelle
2

Eigenschaften sind nur syntaktische Zucker für ein Paar von Accessor-Methoden, und was Sie hier tun, ist also eine Methode aufzurufen und den resultierenden Wert als Referenz zu übergeben. Dieser Wert ist eindeutig keine Variable und kann daher nicht gebunden werden.

Betrachten Sie einen Typ Foo mit einer Eigenschaft Bar ; Die Verwendung dieser Eigenschaft als out -Parameter ist im Wesentlichen analog dazu:

%Vor%

Offensichtlich kann ein Wert nicht foo.get_Bar() ! zugewiesen werden!

    
Will Vousden 27.01.2011 17:22
quelle
2
%Vor%

Hier ist die eigentliche Implementierung:

%Vor%     
Kris Ivanov 27.01.2011 17:21
quelle

Tags und Links