检查 OpenFileDialog 的可为空结果

本文关键字:结果 OpenFileDialog 检查 | 更新日期: 2023-09-27 18:37:12

我在 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 值确实可用,该怎么办?关于此事的文档说:"在当前的实现中,派生类(OpenFileDialog和SaveFileDialog)只会返回true或false",这确实意味着这不是我们可以永远依赖的永久安排。

关于我是否过于谨慎并且应该按照 ReSharper 的建议删除该行的任何想法?

检查 OpenFileDialog 的可为空结果

这看起来确实很奇怪。MSDN 规范声明它将返回 true 或 false,但仍然必须有一个 Nullable 的原因。

我绝对同意你的看法,假设下面的实现是不好的做法。我会根据界面进行编码,所以在这种情况下,我认为检查 HasValue 是正确的方法。

Re-Sharper如何知道?恐怕我无法回答这个问题。这不是我使用的东西,他们可能已经硬编码了它。

您可能会对此感兴趣:Microsoft.Win32.OpenFileDialog.ShowDialog() 何时返回 null?

似乎存在 null 可能性的原因是因为这是用户关闭对话框之前的结果。

它是硬编码的。

如果你在程序文件中查看ReSharper目录,你会看到很多XML文件的名称中带有Nullness.Gen,这些文件包含有关特定元素是否为/不是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>