c# - 做model.GetDeclaredSymbol时如何获取SynthesizedIntrinsicOperatorSymbol而不是SourceUserDefinedOperatorSymbol
问题描述
我在这个问题中看到的操作员解析遇到了麻烦(看看这个.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);
推荐阅读
- ruby-on-rails - 在每个月的第一个和第三个星期一在 ruby 中运行一个 rask 任务
- python - 如何分析烧瓶端点?
- shopify - 显示购物车 Shopify 中不存在的收藏品
- maven - Jenkins 上的 WSO2 单元测试
- maven - Intellij 无法使用 $revision 解析 pom.xml。Maven 作品
- c++ - 为什么相同的图像在 QtWidgets 应用程序和标准预览应用程序中具有不同的亮度?
- c# - 删除行后数据网格未更新
- asp.net-core - RuntimeFrameworkVersion 没有选择指定的版本
- c# - 加载 .NET Framework Web API 时如何捕获异常?
- r - 查找字符串的模式,分配给 r 中的新变量