如何在执行 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
的方法,但它会生成代码中使用的与声明中相同的符号。
实际
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);
如 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
的方法,但它会生成代码中使用的与声明中相同的符号。
实际
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);