10 Stimmen

Kann eine Klasse Eigenschaft/Feld von anonymen Typ in C# 4.0 sein?

Wie in:

public class MyClass {

  private static var MyProp = new {item1 = "a", item2 = "b"};

}

Hinweis: Das obige Beispiel lässt sich nicht kompilieren und funktioniert auch nicht (die var kann dort nicht verwendet werden), es soll nur meinen Standpunkt verdeutlichen.

Update : Nur um die Frage zu klären, ich hatte bereits versucht, mit

private static dynamic MyProp = new {item1 = "a", item2 = "b"};

und das funktioniert, aber es erzeugt keine Intellisense wegen der dynamischen Typisierung. Ich bin mir bewusst, dass die anonyme Typisierung nur ein Compiler-Trick ist, also hoffte ich, diesen Trick zu meinem Vorteil nutzen zu können, indem ich ein strukturiertes Feld deklariere, ohne vorher eine Klasse deklarieren zu müssen (hauptsächlich, weil es nur eine Instanz dieser speziellen Art von Feld geben wird). Jetzt sehe ich, dass das nicht möglich ist, aber ich bin mir nicht sicher, warum das so ist. Wenn der Compiler einfach einen impliziten Typ für ein anonymes Objekt erzeugt, sollte es ziemlich einfach sein, den Compiler diesen impliziten Typ für ein Feld erzeugen zu lassen.

13voto

JaredPar Punkte 699699

Es klingt, als könnten Sie eine oder zwei Fragen stellen, also werde ich versuchen, auf beide einzugehen.

Kann ein Klassenfeld stark auf einen anonymen Typ typisiert werden?

Nein. Anonyme Typennamen können nicht in C#-Code angegeben werden (daher anonymous). Die einzige Möglichkeit, sie statisch zu typisieren, ist

  1. Generische Typinferenz
  2. Verwendung des var Stichwort

Beides trifft auf das Feld eines Typs nicht zu.

Kann ein Klassenfeld mit einem anonymen Typausdruck initialisiert werden?

Ja, das Feld muss nur in einem Typ deklariert werden, der mit anonymen Typen kompatibel ist: object zum Beispiel

public class MyClass { 
  private static object MyProp = new {item1 = "a", item2 = "b"}; 
}

6voto

Egor Pavlikhin Punkte 16795

In C# 7 können Sie dies endlich tun:

private (string Login, string Password) _credentials = (Login: "123", Password: "123");

5voto

abhishek Punkte 2975

Nein, jedes Mitglied sollte explizit typisiert sein.

Sie könnten sich für einen dynamischen Typ entscheiden, um Ihrem Element eine Chance zu geben, zur Laufzeit ausgewertet zu werden.

3voto

Wie wäre es mit der Verwendung von Tuple<string, string> stattdessen?

public class MyClass {

  private static Tuple<string, string> MyProp = Tuple.Create("a", "b");

}

2voto

Joshua Rodgers Punkte 5147

Wenn es sich um C# 4 handelt, sehen Sie sich das dynamische Schlüsselwort an.

public class MyClass 
{ 
  private static dynamic MyProp = new {item1 = "a", item2 = "b"}; 
} 

Sobald Sie dies jedoch tun, verlieren Sie jede Art von Typsicherheit und praktische Compilerprüfungen.

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