如何在建模时获取SynthesiedIntrinsicOperator符号而不是SourceUserDefinedOperator符号。GetDeclaredSymbol [英] How to get SynthesizedIntrinsicOperatorSymbol instead of SourceUserDefinedOperatorSymbol when doing model.GetDeclaredSymbol

查看:0
本文介绍了如何在建模时获取SynthesiedIntrinsicOperator符号而不是SourceUserDefinedOperator符号。GetDeclaredSymbol的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在操作员解析方面遇到了问题,如this question(请看这个.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

基本上,我需要一种方法将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);

这篇关于如何在建模时获取SynthesiedIntrinsicOperator符号而不是SourceUserDefinedOperator符号。GetDeclaredSymbol的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆