带有空条件运算符 (?.) 的 IEnumerable 的可能多重枚举
Possible multiple enumeration of IEnumerable with null-conditional operator (?.)
我认为这是来自 resharper 的误报,但我想听听其他人的意见。也许我遗漏了什么。
我在 Resharper 9.2 和 10 中都发现了这种行为。
考虑这个 class :
public class Foo
{
public IEnumerable<string> SomeList { get; set; }
}
还有这个方法:
public void Method(Foo thisFooCanBeNull)
{
List<string> theList = thisFooCanBeNull?.SomeList?.ToList();
if (theList != null && theList.Count > 0) //Possible multiple enumeration of IEnumerable
{
foreach (string s in theList) //Possible multiple enumeration of IEnumerable
{
//Do something with list.
}
}
}
theList.Count
和 foreach
触发警告,但由于我做了 ToList()
,这是不可能的,对吧?
如果我将 thisFooCanBeNull?.SomeList?.ToList()
更改为 thisFooCanBeNull.SomeList?.ToList()
,它不会触发警告,但是自从 "this foo can be null",好吧,我不想做更改。
有人发现这段代码有问题吗?
我看不出应该枚举多次的情况。我倾向于认为这是与仍然较新的 ? 相关的 R# 错误。运算符,特别是因为将其交换为普通点运算符可以消除错误。
您可能需要通过在 IEnumerable 的任何源代码中放置断点或调试语句来仔细检查它是否实际上没有多次枚举。
我认为这是来自 resharper 的误报,但我想听听其他人的意见。也许我遗漏了什么。
我在 Resharper 9.2 和 10 中都发现了这种行为。
考虑这个 class :
public class Foo
{
public IEnumerable<string> SomeList { get; set; }
}
还有这个方法:
public void Method(Foo thisFooCanBeNull)
{
List<string> theList = thisFooCanBeNull?.SomeList?.ToList();
if (theList != null && theList.Count > 0) //Possible multiple enumeration of IEnumerable
{
foreach (string s in theList) //Possible multiple enumeration of IEnumerable
{
//Do something with list.
}
}
}
theList.Count
和 foreach
触发警告,但由于我做了 ToList()
,这是不可能的,对吧?
如果我将 thisFooCanBeNull?.SomeList?.ToList()
更改为 thisFooCanBeNull.SomeList?.ToList()
,它不会触发警告,但是自从 "this foo can be null",好吧,我不想做更改。
有人发现这段代码有问题吗?
我看不出应该枚举多次的情况。我倾向于认为这是与仍然较新的 ? 相关的 R# 错误。运算符,特别是因为将其交换为普通点运算符可以消除错误。
您可能需要通过在 IEnumerable 的任何源代码中放置断点或调试语句来仔细检查它是否实际上没有多次枚举。