首页 > 解决方案 > 做model.GetDeclaredSymbol时如何获取SynthesizedIntrinsicOperatorSymbol而不是SourceUserDefinedOperatorSymbol

问题描述

我在这个问题中看到的操作员解析遇到了麻烦(看看这个.NET fiddle)。

总之,我有如下代码:

bool a = 3 > 5;
namespace System
{
    public struct Int32
    {
        public static extern bool operator > (int a, int b);
    }
    public struct Boolean { }
}

但是当我GetDeclaredSymbol在操作符的声明中IMethodSymbol使用它时,它给了我与在第一行(bool a = 3 > 5;)中使用它时不同的情况。

我一直在寻找一种类似的方法,GetDeclaredSymbol但它会生成代码中使用的与声明中相同的符号。

实际的

通缉(预期)

基本上,我需要一种SourceUserDefinedOperatorSymbolSynthesizedIntrinsicOperatorSymbol.

例如。

public static IMethodSymbol GetDeclaredSymbol (OperatorDeclarationSyntax ods)
{
    IMethodSymbol opSym = model.GetDeclaredSymbol(ods) ?? throw E;
    if (opSym is SourceUserDefinedOperatorSymbol)
    {
        // convert it to a SynthesizedIntrinsicOperatorSymbol instead
    }
}

标签: c#roslynmicrosoft.codeanalysis

解决方案


我采用的解决方案(除非我得到更好的答案)是声明我的运算符声明,如下所示:

public static bool operator > (int a, int b) => a > b;

然后要获得运算符的符号,我有以下功能:

public static ISymbol GetDeclaredSymbol(CSharpSyntaxNode? declaration) =>
    declaration is OperatorDeclarationSyntax { ExpressionBody: {} bod } } m &&
    bod.DescendantNodes().OfType<BinaryExpressionSyntax>().SingleOrDefault() is {} bes ?
        model.GetSymbolInfo(bes).Symbol! : model.GetDeclaredSymbol(declaration);

推荐阅读