private const object foo = new {Prop1 = 10, Prop2 = 20};
此代码将输出错误CS0836:Anonymous types cannot be used in this expression
。但是,如果您删除const
它将运行正常。为什么在声明常量时不能使用C#匿名类型?
我真的只是想明白。为什么不能在常量声明中使用匿名类型?
更具体地说:应该用什么其他方式来声明这样的常量?
private const object foo = new {Prop1 = 10, Prop2 = 20};
此代码将输出错误CS0836:Anonymous types cannot be used in this expression
。但是,如果您删除const
它将运行正常。为什么在声明常量时不能使用C#匿名类型?
我真的只是想明白。为什么不能在常量声明中使用匿名类型?
更具体地说:应该用什么其他方式来声明这样的常量?
据我所知,在c#中,您可以声明常量只有一组预定义的基元类型:更多详细信息,你可以在这里找到:https://msdn.microsoft.com/en-us/library/ms173119.aspx。匿名类型只是一个由编译器自动编写的不可变引用类型,因此它就像您可以随时编写的正常引用类型一样。
从MSDN
常量可以是数字,布尔值,字符串或空引用
因此,事实上,这里有一个匿名的类型是不相关的:如果你使用的是自定义类你会得到一个类似的错误。
考虑在这些情况下使用static readonly
字段而不是const
。
这就是说,有在这种情况object
型的领域是值得商榷的:没有人谁引用领域将是能够访问Prop1
或Prop2
,等等领域可以说是没用的。
请考虑定义包含您的两个属性的自定义class
(不是匿名类型),并使用它来替代,例如, private static readonly Foo foo = new Foo(10, 20);
你可以通过反射访问属性,所以它可能不像你说的那样无用。 –
这是真的,所以我说“可以说”。尽管使用匿名类型+反射而不是仅仅定制类型将被认为是不好的做法。 – canton7
是的,这看起来确实是一种代码味道。但我可以想到* one *可接受的用例:将此对象传递给['InputExtensions.TextBox'](https://msdn.microsoft.com/en-us/library/dd493049.aspx)接受一个'object'参数,然后将其属性转换为HTML属性。 –