86

我一直在尝试使用十进制值作为字段属性的参数,但出现编译器错误。

我发现这个博客文章链接说当时无法在.NET中使用,有人知道他们为什么选择这个或者我如何使用十进制参数吗?

4

5 回答 5

129

这是 CLR 限制。只有原始常量或原始数组可以用作属性参数。原因是属性必须完全编码在元数据中。这与在 IL 中编码的方法体不同。使用 MetaData 只会严重限制可以使用的值的范围。在当前版本的 CLR 中,元数据值仅限于基元、null、类型和基元数组(可能遗漏了一个次要的)。

小数,而基本类型不是原始类型,因此不能在元数据中表示,这会阻止它成为属性参数。

于 2009-02-03T15:26:57.760 回答
20

我也有同样的问题。我考虑使用字符串。这不是类型安全的,但它是可读的,我认为我们将能够在字符串中写入有效数字:-)。

class BlahAttribute : Attribute
{
  private decimal value;

  BlahAttribute(string number)
  {
    value = decimal.Parse(number, CultureInfo.InvariantCulture);
  }
}

[Blah("10.23")]
class Foo {}

算不上美颜,不过考虑了所有的选择,还是够用了。

于 2010-04-23T14:18:37.410 回答
2

当我遇到这种情况时,我最终将属性上的属性公开为双精度,但在属性内部将它们视为十进制。远非完美,但对于简单的情况,它可能正是您所需要的。

于 2009-07-23T16:49:55.950 回答
1

对于具有属性的实时技巧,我正在使用TypeConverter类。

于 2009-02-04T12:35:35.170 回答
0

您可以使用以下构造函数。当 C# 代码中有十进制文字时,C# 编译器会发出对此构造函数的调用。

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

编辑:我知道这不方便。

于 2009-07-23T16:52:36.663 回答