如何在建模时获取SynthesiedIntrinsicOperator符号而不是SourceUserDefinedOperator符号。GetDeclaredSymbol [英] How to get SynthesizedIntrinsicOperatorSymbol instead of SourceUserDefinedOperatorSymbol when doing model.GetDeclaredSymbol
本文介绍了如何在建模时获取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屋!
查看全文