3

我在这个问题中看到的操作员解析遇到了麻烦(看看这个.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但它会生成代码中使用的与声明中相同的符号。

实际的

  • GetDeclaredSymbol->SourceUserDefinedOperatorSymbol
  • GetSymbolInfo->SynthesizedIntrinsicOperatorSymbol

通缉(预期)

  • GetDeclaredSymbol->SynthesizedIntrinsicOperatorSymbol
  • GetSymbolInfo->SynthesizedIntrinsicOperatorSymbol

基本上,我需要一种SourceUserDefinedOperatorSymbolSynthesizedIntrinsicOperatorSymbol.

例如。

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

1 回答 1

0

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

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);
于 2021-09-24T20:48:10.197 回答