我在C#6.0中编写单元测试(MSTest),我注意到编译器在属性中处理字符串插值的方式有些奇怪.
为什么这样做:
[TestCategory(nameof(MyClass) + "-UnitTest")]
Run Code Online (Sandbox Code Playgroud)
什么时候不这样?
[TestCategory($"{nameof(MyClass)}-UnitTest")]
Run Code Online (Sandbox Code Playgroud)
忽略这可能不是对我的测试进行分类的好方法; 我很好奇为什么编译器允许一个而不是另一个.
当编译器遇到插值字符串时,它立即将其转换为对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与插值字符串的工作方式略有不同,因为它在编译时进行评估,因此没有错误.