c#: what is a constant expression?

假如想象 提交于 2019-12-01 18:45:10

问题


I'm working with attributes at the moment. I often run into the error 'An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type.' I don't really know what 'constant expression' means.

It would have been really useful to be able to pass in a Func<MyType, bool> to the attribute (to be consumed by the code which executes when the attribute is present). But alas, no. I don't understand why that type cannot be placed in assembly metadata, which I assume is the reason I cannot pass it into the attribute.

Can anyone give me any ideas?


回答1:


The compiler needs to be able to create the Attributes at compile time, since they are embedded in your assembly with their actual data (they are instantiated by the compiler and serialized into the output file). That's why you need a constant expression.

Basically you can use all the basic data types (like int, bool, string etc.). You can also use typeof expressions because they will be resolved to metadata tokens identifying a type, which is fine at compile time.

Maybe you can put the concept of your Func<MyType, bool> into an interface that your types implement. Or into a separate handler class that you can pass to your Attribute by using a typeof(MyHandlerClass) expression.




回答2:


Constant expressions are values determined solely at compile-time, including string concatenation of other constant expressions, arithmetic etc.

So for example "" is a constant expression, but String.Empty isn't.

String is the only reference type to support a non-null constant expression. For value types, the primitive types (int etc) and decimal support constant expressions... although you can't use decimal in attributes, as it's not a primitive in the CLR. (You can't even specify decimal as a parameter type in an attribute constructor.)

See section 7.19 of the C# 4 spec for more information.




回答3:


Attributes in C# are compile time artifacts, so in order to be created they have to have a constant type parameters/markers/whatever...

There are possible attempts to do what you are, I suppose, going to do:

Dynamic Attributes in C#




回答4:


A constant-expression is an expression that can be fully evaluated at compile-time.

http://msdn.microsoft.com/en-us/library/aa691319(v=vs.71).aspx (old article but still valid)



来源:https://stackoverflow.com/questions/10445663/c-what-is-a-constant-expression

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!