如何在执行 model.GetDeclaredSymbol 时获取合成的内在运算符符号而不是 SourceUserDefinedOperatorSymbol

How to get SynthesizedIntrinsicOperatorSymbol instead of SourceUserDefinedOperatorSymbol when doing model.GetDeclaredSymbol

this question (take a look at this .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 的方法,但它会生成代码中使用的与声明中相同的符号。

实际

想要(预期)

基本上,我需要一种方法将 SourceUserDefinedOperatorSymbol 转换为 SynthesizedIntrinsicOperatorSymbol

例如

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

我采用的解决方案(除非我得到更好的答案)是像下面这样声明我的运算符声明:

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);