gpt4 book ai didi

c# - ReSharper 错误地声称 IDictionary.Values 总是非空的

转载 作者:太空宇宙 更新时间:2023-11-03 19:42:20 24 4
gpt4 key购买 nike

我得到了以下代码:

    public IEnumerator<TRow> GetEnumerator()
{
if (this._rows.Values == null) return Enumerable.Empty<TRow>().GetEnumerator();

return this._rows.Values.GetEnumerator();
}

Resharper 告诉我 _rows.Values 总是非 null(事实并非如此,因为我使用的 IDictionary 的实现 - PostSharps AdvisableDictionary 从这里 http://doc.postsharp.net/t_postsharp_patterns_collections_advisabledictionary_2 )往往会在创建后立即返回 null(非常笨拙的实现我猜测 - 我不知道他们为什么这样实现)。

enter image description here

无论我使用什么 IDictionary 实现 - 为什么 ReSharper 期望实现以这种方式工作?没有人能保证这是真的。还是我弄错了什么?

按照评论中的要求:显示行为的最小实现(在 return Enumerable.Empty<TRow>().GetEnumerator() 上设置一个断点,它被 resharper 变灰):

 class Program
{
static void Main(string[] args)
{
var model = new Model();

bool any = model.Any();
}
}

[NotifyPropertyChanged]
public class Model : IEnumerable<string>
{
private IDictionary<string, string> dictionary;

public Model()
{
dictionary = new AdvisableDictionary<string, string>();
}

public IEnumerator<string> GetEnumerator()
{
if (dictionary.Values == null) return Enumerable.Empty<string>().GetEnumerator();
return dictionary.Values.GetEnumerator();
}

IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}

此示例需要 PostSharp.Patterns.Model包和 PostSharp 许可证(有可用的试用版)或交换 AdvisableDictionary对于在 Values 上返回 null 的自定义词典 setter/getter 。

最佳答案

在较新的referencesource Microsoft 添加了一些涵盖 IDictionary<,> 的代码契约(Contract):

// Returns a collections of the values in this dictionary.
ICollection<TValue> IDictionary<TKey, TValue>.Values {
get {
Contract.Ensures(Contract.Result<ICollection<TValue>>() != null);
return default(ICollection<TValue>);
}
}

从这份契约(Contract)中可以清楚地看出 Values不能是 null (请注意,它是 mustn't,而不是 can't :-) IDictionary<,> 的错误实现可以回null它不会被运行时捕获)。

关于c# - ReSharper 错误地声称 IDictionary.Values 总是非空的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51519727/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com