Typ 'var' in eine Methode in C # übergeben [duplizieren]

8

Ich habe einige Unterabfragen vom Datentyp var. Diese arbeiten an einer Datentabelle. Ich würde diese gerne an eine andere Methode weitergeben, wie kann ich das machen? Ex:

%Vor%

Nun möchte ich eine Methode definieren, um diese Unterabfragen1, Unterabfragen2 als Variablen zu übergeben. zB:

%Vor%

Und führen Sie die Methode aus:

%Vor%

Wenn ich versuche, var in der Methode bei der Definition zu verwenden, mag ich es nicht. Bitte hilf mir dabei. Danke.

    
svs 11.01.2013, 15:26
quelle

7 Antworten

29

Ihr Ergebnis ist eine Folge anonymer Objekte. var Schlüsselwort sagt nur zum Compiler "Hey, führe Argumente für mich aus der Nutzung her". Das Ableiten von Typen aus der Verwendung wird als Typinferenz bezeichnet. Sie können dem C # -Compiler jedoch nicht sagen, dass er Methodenartenargumente in der Methodendeklaration ableiten soll. Außerdem können Sie im Fall von anonymous objects ihren Namen nicht angeben. Du solltest sie also nicht außerhalb und innerhalb anderer Methoden weitergeben. Sie können sie in dynamic umwandeln und dann über CallSite auf ihre Member zugreifen (der Compiler erstellt sie, wenn Sie auf ein Mitglied eines dynamischen Objekts wie myDynamic.Name zugreifen) oder Sie können anonymes Objekt in object umwandeln und über Reflektion auf seine Eigenschaften zugreifen , aber alle diese Methoden sind nicht c # idiomatisch und vermissen wirklich den Punkt anonymer Objekte. Anstatt anonyme Objekte in der Abfrage zu erstellen

%Vor%

Erstellen Sie einen benutzerdefinierten Typ

%Vor%

Und instantiieren Sie es als Ergebnis der Abfrage wie im nächsten Beispiel: (Sie können var Schlüsselwort anstelle von IEnumerable<Result> ersetzen - kompilierter Code wird gleich sein)

%Vor%

Die Methode sieht aus wie

%Vor%

Dann rufst du updategrid like einfach updategrid(subquery1) an und du wirst die Schönheit der statisch getippten Sequenz deiner Elemente im Körper von updategrid

haben     
Ilya Ivanov 11.01.2013, 15:28
quelle
9

Var ist kein Datentyp. Es ist eine kurze Hand für "herauszufinden, welcher Datentyp das ist, wenn Sie die App kompilieren". Sie können herausfinden, was der Datentyp tatsächlich ist und diesen für Ihren Parameter verwenden, oder Sie könnten eine generische Funktion erstellen, die mit jedem Datentyp arbeitet.

    
atevans 11.01.2013 15:28
quelle
8
%Vor%

Ist kein gültiges C #.

var ist syntaktischer Zucker - die Variable hat einen Typ, aber Sie müssen ihn nicht deklarieren, wenn der Compiler statisch bestimmen kann, was er sein soll.

Mit einem Parameter hat der Compiler nicht genügend Informationen, um den Typ zu bestimmen.

Ebenso können Sie keine Variable mit var ohne Zuweisung deklarieren:

%Vor%

Sie müssen sicherstellen, dass die Arten von subquery1 , subquery2 und die Parameter von updategrid alle gleich sind.

    
Oded 11.01.2013 15:29
quelle
7

Sie können eine Methode mit var Argumenttyp deklarieren. Aber Sie können so schreiben:

%Vor%

var bedeutet take type from right-hand side and declare variable with this type from left-hand side und dies wird in der Kompilierzeit verarbeitet. Wie Sie sehen können, macht die Verwendung von var als Methode keinen Sinn.

    
Alexander Balte 11.01.2013 15:32
quelle
3

Verwenden Sie Object oder dynamic

%Vor%

var - & gt; Statischer Typ, der von der rechten Seite des Ausdrucks bestimmt wird. Kann nicht als Parameter / Rückgabetyp verwendet werden

object - & gt; Basisklasse für alle .NET-Typen.

dynamic - & gt; Der Typ wird zur Laufzeit aufgelöst. Daher werden keine Kompilierzeitüberprüfungen durchgeführt, und intellisense ist nicht verfügbar. Es hat auch Leistungskosten.

    
Tilak 11.01.2013 15:33
quelle
2

In C # gibt es keinen 'var' -Typ. 'var' ist nur ein Schlüsselwort, das den Compiler anweist, 'was als nächstes kommt, um den Typ herauszufinden' zu analysieren. Dies geschieht während der Kompilierung, nicht während der Laufzeit.

Die Variablen, von denen Sie sprechen, werden tatsächlich als anonyme Typen eingegeben, die der Compiler beim Kompilieren automatisch generiert. Solche Typen können, da sie keinen Namen haben, nicht dazu verwendet werden, Parametertypen oder Rückgabewerte zu deklarieren.

Sie sollten entweder explizite Klassen für diese Daten erstellen oder in .Net4 oder höher das Tuple & lt; & gt; generischer Typ.

    
Oskar Berggren 11.01.2013 15:30
quelle
0

Sie könnten wahrscheinlich eine dynamische Referenz verwenden, aber dafür würde ich nicht gehen.

Stattdessen ist es besser, tatsächliche Klassen für diese Datentypen zu erstellen und sie stattdessen an die Methoden zu übergeben.

Zum Beispiel:

%Vor%

Was Sie so erstellen können:

%Vor%

und haben eine Funktion wie folgt:

%Vor%     
musefan 11.01.2013 15:29
quelle

Tags und Links