我有一个带有以下签名的方法
[Specification]
public void slide_serialization() {
从我的代码中的一点开始,我需要向上移动堆栈跟踪以找到与SpecificationAttribute
最接近的方法(这里的性能不是问题)。我发现这个方法,但我找不到任何自定义属性。
我认为我从未见过这种情况。可能是什么原因?
这是一个单元测试程序集,在Build中禁用了优化。
答案 0 :(得分:5)
代码片段并不多见。但是堆栈跟踪很清楚发生了什么。请注意跟踪中的<>c_DisplayClass5
类型名称。这是一个自动生成的类,由C#编译器在重写代码以编译带闭包的lambda表达式时生成。 this Q+A的主题。
还重写了slide_serialization()方法,现在获取了不可言换的<slide_serialization>_b40
方法名称。使用尖括号是有意的,它确保自动生成的代码中的成员永远不会与程序中的标识符名称冲突。
您发现编译器中的代码重写逻辑存在限制。它不会将原始代码上的[attributes]转移到重写代码。微软是否认为投入这些努力是不够重要的,或者他们无法正确地为每一个可能的代码重写规则做到这一点尚不清楚。我强烈怀疑后者,这种限制非常痛苦。程序员通常会发现需要[SuppressMessage]属性才能在没有警告的情况下通过代码分析而感到非常懊恼。
没有简单的解决方法,你必须处理这个限制。