C# 可能使用.GetType()多次枚举IEnumerable警告
我使用以下代码获得ReSharper警告“IEnumerable可能多次枚举”:C# 可能使用.GetType()多次枚举IEnumerable警告,c#,linq,resharper,enumerator,gettype,C#,Linq,Resharper,Enumerator,Gettype,我使用以下代码获得ReSharper警告“IEnumerable可能多次枚举”: public void Mymethod(IEnumerable<int> entities) { var enumerator = entities.GetEnumerator(); var entityType = entities.GetType(); } public void Mymethod(IEnumerable实体) { var枚举器=entities.GetEnumera
public void Mymethod(IEnumerable<int> entities)
{
var enumerator = entities.GetEnumerator();
var entityType = entities.GetType();
}
public void Mymethod(IEnumerable实体)
{
var枚举器=entities.GetEnumerator();
var entityType=entities.GetType();
}
正如在许多stackoverflow主题中所描述的(以及在上所描述的)一样,ReSharper识别出查询运行了两次
我的问题是,为什么“GetType()”语句被识别为查询
有什么建议吗
提前感谢。为了调用
GetTypes
,需要从ReSharper的角度对实体
进行评估(它不知道GetTypes
是否需要对枚举进行评估,这就是为什么它说“可能的多重枚举”)。由于ReSharper发现方法中有多个位置具有相同的场景,因此它会发出此警告
这可能是问题,也可能不是问题,这取决于
实体
表示的内容以及您对其执行的操作。如果它表示内存中的数组,或者您执行的操作不遍历列表,那么就不需要太担心了。如果您对它进行迭代,并且它表示一个将进入数据库的查询,那么最好显式地枚举它(通过调用ToList
或ToArray
),然后根据结果进行操作。这只是因为Resharper不够聪明GetType
不是一个虚拟方法,它不会影响IEnumerable
我很确定它指的是枚举器
行。它可能正在寻找相应的Dispose()
调用。我得到了这两条语句的警告。如果我只调用了两次.GetType(),而不是.GetEnumerator()@AakashM,也会发生这种情况。@AakashM:感谢您在中提交。看起来下一个版本会修复这个错误。我期待更新;-)<代码>实体是处于特定状态的对象。一个电话怎么能改变这种状态?@dtb:我有点不清楚;这是从ReSharper的角度讲的。感谢您指出这一点,我更新了答案以澄清这一点。