我在WPF应用程序中编写了一些代码,如下所示:
var dialog = new OpenFileDialog { Filter = this.FileExtensionFilter };
var dialogResult = dialog.ShowDialog();
if (dialogResult.HasValue && dialogResult.Value)
{
... Process result of dialog ...
}
一切都很好,我想,但是ReSharper在dialogResult.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建议删除该行的想法?
答案 0 :(得分:3)
看起来很奇怪。 MSDN规范声明它将返回true或false,但仍然必须有Nullable的原因。
我绝对同意你的观点,假设下面的实现是不好的做法。我会根据接口进行编码,所以在这种情况下我认为检查HasValue是正确的方法。
Re-sharper如何知道?我恐怕无法回答这个问题。这不是我使用的东西,它们可能已经硬编码了。
您可能会对此感兴趣:When does Microsoft.Win32.OpenFileDialog.ShowDialog() return null?
似乎存在null的可能性是因为这是用户关闭对话框之前的结果。
答案 1 :(得分:3)
它是硬编码的。
如果您查看Program Files中的ReSharper目录,您会在名称中看到许多带有 Nullness.Gen 的XML文件,其中包含有关特定元素是否为/或不是的规则null,这些用于显示警告,例如您正在看到的警告,它们将无法正常显示。
如果在 Bin \ ExternalAnnotations.NETFramework \ System.Windows 中找到 2.0.5.0.Nullness.Gen.xml 文件,您会发现以下条目大约有一半下来:
<member name="M:System.Windows.Controls.OpenFileDialog.ShowDialog">
<attribute ctor="M:JetBrains.Annotations.NotNullAttribute.#ctor" />
</member>
然后,您可以查看 bin 目录中的 JetBrains.Annotations ,以查看 NotNullAttribute 的定义:
<member name="T:JetBrains.Annotations.NotNullAttribute">
<summary>
Indicates that the value of the marked element could never be <c>null</c>
</summary>
<example><code>
[NotNull] public object Foo() {
return null; // Warning: Possible 'null' assignment
}
</code></example>
</member>