值类型运算符解析问题:自定义声明运算符与使用的运算符不相等
原因分析
两个运算符打印字符串完全一致,但实际属于不同类型的成员,因此相等性对比返回false,核心原因如下:
- 你代码中定义的
System.Int32是当前编译程序集内的自定义类型,和.NET运行时核心库内置的原生System.Int32是互相独立的两个类型。二者即使命名、命名空间、成员签名完全一致,因为所属程序集不同,对应的类型符号本身就不相等。 - 表达式
3 > 5中的操作数是int字面量,C#编译器语义分析阶段会优先将运算符绑定到原生System.Int32的>运算符实现,而非你自定义的同名类型的运算符。最终你拿到的usedSymbol是原生类型的运算符,declaredSymbol是自定义类型的运算符,二者自然不相等。
验证方法
如果希望两个符号相等,可以在创建编译对象时配置不引用默认核心运行库,此时编译器找不到原生System.Int32类型,就会将运算符绑定到你自定义的实现:
var compilation = CSharpCompilation.Create("bla", options: new CSharpCompilationOptions(OutputKind.ConsoleApplication) .WithCoreAssemblyName(null)) // 禁用默认核心程序集绑定 .AddSyntaxTrees(tree);
修改后运行代码就会得到两个运算符相等的结果。
内容的提问来源于stack exchange,提问作者trinalbadger587
相关产品推荐
相关产品推荐

