我在WPF应用程序中编写了一些代码,如下所示:
var dialog = new OpenFileDialog { Filter = this.FileExtensionFilter };
var dialogResult = dialog.ShowDialog();
if (dialogResult.HasValue && dialogResult.Value)
{
... Process result of dialog ...
}
一切都很好,我想,但是ReSharper在checkResult.HasValue的检查中提出了一个警告,“表达总是正确的”.
第一个问题是ReSharper如何知道dialogResult总是有结果 – 它必须潜入到Microsoft.Win32.OpenFileDialog类的反编译代码中,并观察到它永远不会返回null.要么就是这个,要么它只是一个专门针对这个类的硬编码警告.
其次,假设结果永远不会为空,似乎不是一种好的做法.如果Microsoft发布了null值可用的库的未来版本,该怎么办?关于此事的文件说:“In the current implementation, the derived classes (OpenFileDialog and SaveFileDialog) will only return true or false”这意味着这不是我们可以永远依赖的永久性安排.
是否有任何想法我是否过于谨慎,应该删除ReSharper建议的那条线?
解决方法:
这看起来很奇怪. MSDN规范声明它将返回true或false,但仍然必须有Nullable的原因.
我完全同意你的观点,假设下面的实现是不好的做法.我会根据接口进行编码,所以在这种情况下我认为检查HasValue是正确的方法.
Re-sharper如何知道?我恐怕无法回答这个问题.这不是我使用的东西,它们可能已经硬编码了.
您可能会对此感兴趣:When does Microsoft.Win32.OpenFileDialog.ShowDialog() return null?
似乎存在null的可能性的原因是因为这是用户关闭对话框之前的结果.