.NET Reflector 是不是无法正确反映空合并运算符?

Posted

技术标签:

【中文标题】.NET Reflector 是不是无法正确反映空合并运算符?【英文标题】:Is the .NET Reflector unable to reflect over the null-coalescing operator correctly?.NET Reflector 是否无法正确反映空合并运算符? 【发布时间】:2015-12-08 23:58:47 【问题描述】:

我写了这段代码:

private Queue<int> EnsureQueue()

    return _queue ?? (_queue = new Queue<int>(10));

反射器给了我:

private Queue<int> EnsureQueue()

    if (this._queue == null)
    
    
    return (this._queue = new Queue<int>(10));

显然,这不是原始代码所说的。当(this._queue = new Queue&lt;int&gt;(10)); 不是null 时,(this._queue = new Queue&lt;int&gt;(10)); 行将始终返回new Queue&lt;int&gt;(10) 而不是_queue

这是.NET Reflector 中的错误还是我遗漏了什么?该程序似乎运行正常...

编辑 -> 看我的回答

【问题讨论】:

该??运算符是语法糖,你会看到编译器将它翻译成什么。 @RonBeyer 但是输出不正确,是吗? 你能发布原始IL吗?如果您看到反射器试图转换的内容可能会更清楚。通常我发现 JetBrains DotPeek 比 Redgate 的更准确一些,而且我反对在 Redgate “承诺”保持 Reflector 免费后开始使用它,然后开始为它疯狂收费。 DotPeek 是免费的。 ILSpy 是一个免费的 Reflector 克隆,非常棒。甚至还有一个 Reflexil 插件的端口,可以让您编辑程序集的 IL。 @M.kazemAkhgary ?? 之后的部分只有在之前的部分是null 时才会执行。 【参考方案1】:

这就是我的 Reflector 副本对这种方法所做的:

private Queue<int> EnsureQueue()

    return (this._queue ?? (this._queue = new Queue<int>(10)));

对我来说看起来相当不错。版本 8.5.0.179,请务必更新您的版本。

【讨论】:

我其实有同一个版本:8.5.0.179(试用???!!!(希望这不是问题的根源)) 这不太可能。也许你应该发布一个更好的 sn-p,我不得不猜测 _queue 变量。 Reflector 是否有任何选项,例如 C# 版本、编译器版本、如何反编译某些结构等?

以上是关于.NET Reflector 是不是无法正确反映空合并运算符?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用.NET Reflector修改已封装好的.dll文件

求教.net reflector如何使用

.Net Reflector反编译工具如何将注释显示出来?

dnspy 好,还是.net reflector 好

使用asp.net反编译Reflector的问题

用Reflector for .NET反编译dll文件(.net),把整个dll导出个cs插件