Warum ist ein Nullable<T> keine gültige Benutzerdefinierte Attribut-Parameter bei der T ist?
Wenn ich ein enum wie diese
public enum Hungry
{
Somewhat,
Very,
CouldEatMySocks
}
und ein benutzerdefiniertes Attribut wie dieses
public class HungerAttribute : Attribute
{
public Hungry HungerLevel { get; set; }
public Hungry? NullableHungerLevel { get; set; }
}
Kann ich dies tun
[Hunger(HungerLevel = Hungry.CouldEatMySocks)]
public class Thing1
aber ich kann dies nicht
[Hunger(NullableHungerLevel = Hungry.CouldEatMySocks)]
public class Thing2
Generiert es einen Fehler, der sagt "NullableHungerLevel' is not a valid named attribute argument, denn es ist nicht ein gültiges Attribut parameter-Typ".
Warum ist das nicht erlaubt? Ich verstehe, dass es grundsätzlich einfach nicht auf der Liste der akzeptierten Arten. Die gültigen Typen zu sein scheinen, primitive, Enumerationen, Strings, Typ und eindimensionale arrays der vorhergehenden Arten.
Ist dies nur eine alte Regel, die nicht aktualisiert werden, wenn Nullable kam?
- Während ich ursprünglich kam über diese .NET 3.5 VS2008 es funktioniert immer noch nicht in VS2010 Beta1.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hungry?
gleichNullable<Hungry>
, die im Allgemeinen bedeuten, dassgleich
Da kann man nur Konstante Werte in benannte Attribut Argumente, die Sie haben, zu greifen, zu Hangeln Lösung.
Dies zu umgehen, erstellen Sie eine andere Initialisierung in Ihrem Attribut:
Ich verstehen, dass Sie nicht beide Eigenschaften.
Attribute haben können als nur die Parameter primitive, typeof expressions " und " array-creation-expression.
Nullable ist ein struct.
Daher ist es dort nicht erlaubt.
Vermute ich, dass die assembly-Datei-format selbst erlaubt keine Speicherung von komplexen Datentypen, wie Strukturen in den Ort, wo die Attribut-Werte gespeichert werden.
Ich kenne keine Pläne, das zu ändern. Aber ich kann mir nicht erklären, warum diese Einschränkung vorhanden ist.
Anstatt enum-Werte zulässt, können Sie die create default-Wert für das enum. Enum default-vom 1. Wert, also setzen Sie Ihre enum-wie dies
in Ihrem code könnten Sie tun, um zu überprüfen, für null