2009-02-03 6 views
63

Ich habe versucht, Dezimalwerte als Parameter für ein Feldattribut zu verwenden, aber ich erhalte einen Compilerfehler.Verwenden Sie Dezimalwerte als Attributparameter in C#?

Ich fand diesen Blogpost link sagen, es war nicht möglich in .Net zu verwenden, dann weiß jemand, warum sie das wählen oder wie kann ich Dezimalparameter verwenden?

Danke.

Antwort

92

Dies ist eine CLR-Einschränkung. Nur primitive Konstanten oder Arrays von Primitiven können als Attributparameter verwendet werden. Der Grund dafür ist, dass ein Attribut vollständig in Metadaten codiert werden muss. Dies ist anders als ein Methodenkörper, der in IL codiert ist. Die Verwendung von MetaData schränkt den Umfang der verwendbaren Werte nur stark ein. In der aktuellen Version der CLR sind Metadatenwerte auf Primitive, Nullwerte, Typen und Arrays von Primitiven beschränkt (möglicherweise haben sie einen kleineren Wert verpasst).

Dezimalstellen während eines Basistyps sind kein primitiver Typ und können daher nicht in Metadaten dargestellt werden, wodurch verhindert wird, dass sie ein Attributparameter ist.

+0

Danke, ich dachte dezimal war ein primitiver Typ :-) – rjlopes

+2

Ist das immer noch ein Problem mit Framework 4.0? und 4.5, 4.6.x? – midspace

+0

@midspace, nicht wirklich ein Problem, nur eine Einschränkung, durch das Design auferlegt. Es ist bedauerlich, aber gute Chancen, dass es nie weggehen wird. –

2

Wenn ich in diese Situation geraten bin, habe ich die Eigenschaften des Attributs als Double herausgestellt, aber im Attribut behandelte sie wie Decimal. Weit davon entfernt, perfekt zu sein, aber für die einfachen Fälle könnte es genau das sein, was Sie brauchen.

0

Sie können den folgenden Konstruktor verwenden. Wenn Sie ein Dezimal-Literal in C# -Code haben, gibt der C# -Compiler einen Aufruf an diesen Konstruktor aus.

Decimal(Int32, Int32, Int32, Boolean, Byte)

Edit: Ich weiß, das ist nicht bequem.

+1

Wenn dies in einem Attribut funktioniert, dann würde ich raten einfach mit dem Suffix "m", aber auch nicht (Using System.ComponentModel.DefaultValueAttribute als mein Test) – xr280xr

13

Ich habe das gleiche Problem. Ich erwäge, Strings zu verwenden. Dies ist nicht typsicher, aber es ist lesbar und ich denke, wir können gültige Zahlen in Strings schreiben :-).

Es ist keine Schönheit, aber nach Berücksichtigung aller Optionen ist es gut genug.

+1

Sieht aus wie das ist, wie mbUnit http: // vkreynin bewältigt. wordpress.com/2007/05/25/mbunit-24-rtm-now-you-can-use-decimals-in-row-attributes/ –