.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<int>(10));
不是null
时,(this._queue = new Queue<int>(10));
行将始终返回new Queue<int>(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 是不是无法正确反映空合并运算符?的主要内容,如果未能解决你的问题,请参考以下文章