Welche Syntax ist beim Anwenden von C # -Attributen zulässig?

8

Dies sind die häufigsten und einzigen Muster, die ich bisher gesehen habe:

%Vor%

Die Attributsyntax sieht folgendermaßen aus: Sie rufen einen Konstruktor auf. Und bevor C # optionale und benannte Argumente unterstützte, waren benannte Parameter für Attribute der einzige sichtbare Unterschied.

Erlaubt der C # -Compiler noch etwas? Wie params Argumente oder Objekt / Sammlung Initialisierer?

Siehe auch: Anwenden von Attributen auf MSDN

    
Michiel van Oosterhout 18.01.2012, 21:56
quelle

3 Antworten

3

AFAIK, benannte Parameter erlauben nur ganzzahlige Typen. Leider habe ich keinen Hinweis darauf, dies zu bestätigen, ich habe es nur durch meine eigenen Experimente gelernt.

Beim Versuch, Objektinitialisierer zu verwenden, habe ich diesen Fehler vom Compiler bekommen:

  

Ein Attributargument muss ein konstanter Ausdruck, Ausdruckstyp oder Arrayerstellungsausdruck eines Attributparametertyps

sein

Obwohl diese Dokumentation ein paar Jahre alt ist, Es hat die Referenzinformationen, nach denen ich gesucht habe:

  

Attributparameter sind auf konstante Werte von   folgende Typen:

     
  • Einfache Typen (bool, byte, char, short, int, long, float und double)
  •   
  • Zeichenfolge
  •   
  • System.Type
  •   
  • enums
  •   
  • object (Das Argument eines Attributparameters vom Typ object muss ein konstanter Wert eines der obigen Typen sein.) Eindimensional   Arrays der oben genannten Typen
  •   

So funktioniert das:

%Vor%

Während dies nicht:

%Vor%

BEARBEITEN: Um es nur auszudrücken: Attribute bilden einen Teil der Metadaten für Konstrukte, auf die sie angewendet werden (innerhalb der generierten IL), daher müssen die Mitglieder der Attributklasse zur Kompilierungszeit bestimmt werden; daher die Beschränkung der Attributparameter auf konstante Werte.

    
James Shuttler 18.01.2012, 22:02
quelle
3

Zusätzlich zu dem, was andere gesagt haben, möchte ich darauf hinweisen, dass Attribute auch durch Kommas getrennt sein können.

%Vor%     
Trystan Spangler 18.01.2012 23:14
quelle
0
  

Positionsparameter sind erforderlich und müssen vor allen benannten Parametern stehen; Sie entsprechen den Parametern eines der Konstruktoren des Attributs. Benannte Parameter sind optional und entsprechen den Lese- / Schreibeigenschaften des Attributs. Geben Sie in C ++, C # und J # für jeden optionalen Parameter name = value an, wobei name der Name der Eigenschaft ist. In Visual Basic geben Sie name: = Wert ein.

Von dem von Ihnen angegebenen Link. Es sieht so aus, als wären das die einzigen Dinge, die erlaubt sind. Im Grunde genommen kombinieren Sie den Konstruktor wie bereits erwähnt mit der Initialisierungslogik für eingebettete Eigenschaften.

    
Guvante 18.01.2012 21:59
quelle

Tags und Links