C# 7 局部函数:是不是允许属性/方面?

Posted

技术标签:

【中文标题】C# 7 局部函数:是不是允许属性/方面?【英文标题】:C# 7 Local Functions: are attributes / aspects allowed?C# 7 局部函数:是否允许属性/方面? 【发布时间】:2017-04-19 14:36:51 【问题描述】:

C# 7 引入了本地函数(这很棒!)。假设我有以下代码:

    using System;
    using PostSharp.Aspects;

    namespace AspectCS7
    
        class Program
        
            private static void Main()
            
                [MyAspect]            
                void LocalFunction()
                
                    Console.WriteLine("Hello Aspect!");
                

                LocalFunction();
            
        

        [Serializable]
        public class MyAspect : OnMethodBoundaryAspect
        
            public override void OnEntry(MethodExecutionArgs args)
            
                Console.WriteLine("Entering Aspect");
            
        
    

此代码显示编译时错误。是否可以将属性应用到本地函数?

【问题讨论】:

从这个Roslyn issue看来,属性(也许函数上不允许)没有实现。 不,不可能。如果是这样,您的代码将编译。 @InBetween 这不是一个真正的答案,他们可能(出于某种疯狂的原因)更改了本地函数中属性的语法。 @DavidG 不在任何地方记录它?我觉得很难相信。如果 Microsoft 发布的 whats new in C#7 文档中没有明确提及并且正常语法不起作用,我倾向于相信显而易见的:本地函数上不允许使用属性。这是一个有趣的功能,DebuggerStepThrough 在一些辅助函数中可能会被严重遗漏。 @InBetween 我也觉得难以置信,但并非不可能。没有正式的 C#7 规范,其实还没有正式的 C#6 规范! 【参考方案1】:

在某一点上允许本地函数上的属性。有一些 examples on the web 的局部函数使用属性,但是它们不再被允许。

更新: 以下是关于此主题的持续讨论:https://github.com/dotnet/csharplang/issues/794。

【讨论】:

@PetSerAl,底部有一个使用 [CallerMemberName] 的示例。你可以在这里看到一个类似的例子:nimaara.com/2017/04/01/local-functions-a-new-c

以上是关于C# 7 局部函数:是不是允许属性/方面?的主要内容,如果未能解决你的问题,请参考以下文章

产量和静态局部变量的比较

用Python写一个计算器,不允许使用计算器方面的内置函数,只能使用+-,使用到正则表达式。

F# 在非确定性浮点计算方面是不是受到相同的 C# 警告?

养成这7个良好的编程习惯,可以很大程度上增加你的Python性能

在安全方面,允许特定域的 CORS 是不是有意义?

在 C# 的 ToUpper 或 SQL 中的 Upper 函数的性能方面哪个更好