1

我有以下函数,它遵循 TryGet 模式,带有一个输出参数,如果 null 将返回 false,如果它不为 null,它将返回 true

public bool TryGetFileFormat(string extension, [CanBeNull] out IFileFormat fileFormatter)
{
    fileFormatter = Plugins?.FirstOrDefault(plugin => plugin?.FileExtension != null && plugin.FileExtension.Equals(extension));
    return (fileFormatter != null);
}

然后我使用以下代码调用该函数:

IFileFormat fileFormatPlugin;
if (_pluginLoader.TryGetFileFormat(extension, out fileFormatPlugin))
{
    fileFormatPlugin.DoStuff();

Resharper 然后警告我 fileFormatPlugin 可能为空。我如何告诉 resharper,如果函数返回 false,它只会为 null?

编辑我怀疑我可以用 ContractAnnotation 以某种方式处理这个问题,但不确定语法。

4

1 回答 1

2

如果您在函数返回 false 时使用该值,以下合约注释会导致 resharper 仅对空引用发出警告

[ContractAnnotation("fileFormatter : null => false")]
public bool TryGetFileFormat(string extension, [CanBeNull]out IFileFormat fileFormatter){
    fileFormatter = Plugins?.FirstOrDefault(plugin => plugin?.FileExtension != null && plugin.FileExtension.Equals(extension));
    return (fileFormatter != null);
}
于 2017-09-07T02:10:47.413 回答