使用Roslyn检测c#6功能

时间:2016-05-20 08:24:41

标签: c# roslyn

有没有办法用roslyn诊断分析仪检测c#6功能?

我有一个解决方案,它链接到一个不能使用c#6功能的项目中的某些文件,因此我想为这些文件制作一个错误。 要清楚 - 我不能将整个项目设置为c#5,只有一些文件没有限制。

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

2 个答案:

答案 0 :(得分:2)

您可以使用此Walker检测C#6语法功能:

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语法库中的this file

答案 1 :(得分:1)

我认为最好的方法是使用高级构建选项。转到您的项目属性,然后选择" Build"标签。在该选项卡的右下角(您可能需要向下滚动),您应该看到一个"高级"按钮。点击它,你就会得到这个对话框:

Advanced Options

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

enter image description here