首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Roslyn检测c# 6特性

用Roslyn检测c# 6特性
EN

Stack Overflow用户
提问于 2016-05-20 08:24:41
回答 2查看 308关注 0票数 5

有办法用罗斯林诊断分析仪检测c# 6功能吗?

我有一个解决方案,可以链接到一些无法使用c#6特性的项目中的文件中,所以我只想对这些文件造成错误。要明确的是-我不能将整个项目设置为c#5,只有一些文件是不允许的。

我可以尝试捕捉特定的特性,但是它很麻烦,我想知道是否有更快的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-21 15:26:10

您可以使用这个Walker来检测C# 6的语法特性:

代码语言:javascript
运行
复制
public class CSharp6FeaturesWalker : CSharpSyntaxWalker
{
    public bool CSharp6Features { get; private set; }

    public CSharp6FeatureWalker()
    {
    }

    public override void VisitPropertyDeclaration(PropertyDeclarationSyntax node)
    {
        if (node.ExpressionBody != null)
        {
            CSharp6Features = true;
        }
        else if (node.Initializer != null)
        {
            CSharp6Features = true;
        }
        base.VisitPropertyDeclaration(node);
    }

    public override void VisitMethodDeclaration(MethodDeclarationSyntax node)
    {
        if (node.ExpressionBody != null)
        {
            CSharp6Features = true;
        }
        base.VisitMethodDeclaration(node);
    }

    public override void VisitOperatorDeclaration(OperatorDeclarationSyntax node)
    {
        if (node.ExpressionBody != null)
        {
            CSharp6Features = true;
        }
        base.VisitOperatorDeclaration(node);
    }

    public override void VisitConversionOperatorDeclaration(ConversionOperatorDeclarationSyntax node)
    {
        if (node.ExpressionBody != null)
        {
            CSharp6Features = true;
        }
        base.VisitConversionOperatorDeclaration(node);
    }

    public override void VisitIndexerDeclaration(IndexerDeclarationSyntax node)
    {
        if (node.ExpressionBody != null)
        {
            CSharp6Features = true;
        }
        base.VisitIndexerDeclaration(node);
    }

    public override void VisitConditionalAccessExpression(ConditionalAccessExpressionSyntax node)
    {
        CSharp6Features = true;
        base.VisitConditionalAccessExpression(node);
    }

    public override void VisitInterpolatedStringExpression(InterpolatedStringExpressionSyntax node)
    {
        CSharp6Features = true;
        base.VisitInterpolatedStringExpression(node);
    }

    public override void VisitCatchFilterClause(CatchFilterClauseSyntax node)
    {
        CSharp6Features = true;
        base.VisitCatchFilterClause(node);
    }
}

不幸的是,由于某些特性,例如nameof操作符(它既可以是特殊的方法,也可以是通常的方法),无法检测仅基于语法检查的6版本编写的文件是否取决于内容。

为了测试C# 6特性,您可以使用来自ANTLR语法库的这个文件

票数 2
EN

Stack Overflow用户

发布于 2016-05-20 13:27:30

我相信最好的方法是使用先进的构建选项。转到您的项目属性并选择"Build“选项卡。在该选项卡的右下角(您可能需要向下滚动),您应该看到一个“高级”按钮。单击该按钮,您将得到以下对话框:

如您所见,您可以将特定项目的语言级别更改为C# 5.0。一旦您这样做了,并且尝试使用字符串内插,您将被提示一个错误:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37341634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档