检查OpenFileDialog的可空结果

时间:2013-10-29 11:05:35

标签: c# wpf resharper nullable openfiledialog

我在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建议删除该行的想法?

2 个答案:

答案 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>