为什么我不能在属性中使用字符串插值?

Nat*_*ini 14 c# c#-6.0

我在C#6.0中编写单元测试(MSTest),我注意到编译器在属性中处理字符串插值的方式有些奇怪.

为什么这样做:

[TestCategory(nameof(MyClass) + "-UnitTest")]
Run Code Online (Sandbox Code Playgroud)

什么时候不这样?

[TestCategory($"{nameof(MyClass)}-UnitTest")]
Run Code Online (Sandbox Code Playgroud)

忽略这可能不是对我的测试进行分类的好方法; 我很好奇为什么编译器允许一个而不是另一个.

Ale*_*ker 8

当编译器遇到插值字符串时,它立即将其转换为对String.Format... 的调用...

[TestCategory($"{nameof(MyClass)}-UnitTest")]
Run Code Online (Sandbox Code Playgroud)

成为...

[TestCategory(string.Format("{0}-UnitTest", nameof(MyClass)))]
Run Code Online (Sandbox Code Playgroud)

属性要求它们的参数是常量表达式,但上述表达式在执行时间之前不会被评估,因此错误...

CS0182属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式...

知道所有信息可以在编译时获得,但编译器不够聪明,无法弄明白.

nameof与插值字符串的工作方式略有不同,因为它在编译时进行评估,因此没有错误.


Jim*_*mmy 6

插值字符串不是常量值.该值在运行时确定,即使在您的情况下,所有输入都可以在编译时计算.