2015-07-11 79 views
3
private const object foo = new {Prop1 = 10, Prop2 = 20}; 

此代码将输出错误CS0836:Anonymous types cannot be used in this expression。但是,如果您删除const它将运行正常。为什么在声明常量时不能使用C#匿名类型?

我真的只是想明白。为什么不能在常量声明中使用匿名类型?

更具体地说:应该用什么其他方式来声明这样的常量?

回答

2

据我所知,在c#中,您可以声明常量只有一组预定义的基元类型:更多详细信息,你可以在这里找到:https://msdn.microsoft.com/en-us/library/ms173119.aspx。匿名类型只是一个由编译器自动编写的不可变引用类型,因此它就像您可以随时编写的正常引用类型一样。

5

MSDN

常量可以是数字,布尔值,字符串或空引用

因此,事实上,这里有一个匿名的类型是不相关的:如果你使用的是自定义类你会得到一个类似的错误。

考虑在这些情况下使用static readonly字段而不是const

这就是说,有在这种情况object型的领域是值得商榷的:没有人谁引用领域将是能够访问Prop1Prop2,等等领域可以说是没用的。

请考虑定义包含您的两个属性的自定义class(不是匿名类型),并使用它来替代,例如, private static readonly Foo foo = new Foo(10, 20);

+0

你可以通过反射访问属性,所以它可能不像你说的那样无用。 –

+0

这是真的,所以我说“可以说”。尽管使用匿名类型+反射而不是仅仅定制类型将被认为是不好的做法。 – canton7

+0

是的,这看起来确实是一种代码味道。但我可以想到* one *可接受的用例:将此对象传递给['InputExtensions.TextBox'](https://msdn.microsoft.com/en-us/library/dd493049.aspx)接受一个'object'参数,然后将其属性转换为HTML属性。 –

相关问题