如何在使用 model.GetDeclaredSymbol 时获得 SynthesizedIntrinsicOperatorSymbol 而不是 SourceUserDefinedOperatorSymbol

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

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

但它们是不同的: 第一个 (usedSymbol) 是 BuitlInOperator 的类型,而 declaredSymbolsUserDefinedOperator 的类型。简言之 - bool a = 3 > 5; 不使用您的运算符 - 它使用整数的内置运算符。因此,一个不能被“转换”为另一个。 - Evk
我的意思是,如果我定义了一个“UserDefinedOperator”,我希望有一些东西可以找到与声明匹配的“BuiltInOperator”。 - trinalbadger587
我仍然不清楚您试图解决的问题是什么。这些运算符是不同的。如果您有所有内置运算符的列表,理论上可以逐个检查它们,以查看是否有任何一个与您拥有的用户定义运算符匹配(通过比较它们的签名)。 - Evk
@Evk,是的,我知道这些运算符是不同的,但我有一个“Dictionary<IMethodSymbol, <a method info class>>”。但是当我声明operator > (int, int)时,我希望它将“BuiltinOperator”添加到字典中,而不是“UserDefinedOperator”,这样当它在代码中使用时,我可以将其与我的方法信息类匹配。 - trinalbadger587
@Evk,我尝试了你说的方法,但是我无法弄清如何获取内置运算符列表。这就是我遇到的问题。 - trinalbadger587
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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接