这与这个不同,因为那种情况下警告是有效的。而在这种情况下,根据被接受的答案,警告是无效的。我在寻找答案时看到了那个问题,但它并没有回答这个问题。
给定以下代码:
internal List<PaletteClass> GetPaletteList( int userId )
{
using(var stashEntities = new StashEntities<StashClass>())
using(var paletteEntities = new PaletteEntities<PaletteClass>())
{
var paletteList = from palette in paletteEntities.Palettes
from stash in stashEntities.Stashes
where palette.UserId == userId && stash.StashId == palette.StashId
select palette;
return paletteList.ToList();
}
}
当StashEntities和PaletteEntities继承自DBContext时,我收到了一个警告:“访问已释放的闭包”,它涉及到如下图所示的stashEntities。
我知道这是为了防止在参数超出作用域后表达式被评估的情况。但是,在这种情况下,表达式被分配给了使用中的列表,因此stashEntities应该在作用域内。
请注意,如果我按如下方式交换表达式:
var paletteList = from stash in stashEntities.Stashes
from palette in paletteEntities.Palettes
where palette.UserId == userId && stash.StashId == palette.StashId
select palette;
return paletteList.ToList();
然后ReSharper将警告移动到paletteEntities。
问题:在这种情况下,这个ReSharper警告是否值得担心,或者我应该只是添加一个ReSharper注释来忽略此行?
奖励问题(如果前一个问题的答案是忽略):如果我只返回paletteList而不调用ToList()强制计算表达式会发生什么?在原始示例中,ReSharper不担心paletteEntities这一点使我认为有些事情正在发生以保持它在作用域内,那么stashEntities也是如此,一切都会很好吗?
更新/简化
如下图所示,即使只使用一个DBContext(stashPaletteEntities),我也会收到相同的消息,这意味着接受的答案是正确的 - 这是ReSharper中的一个bug。如果引用stashPaletteEntities的第一行是OK的,那么第二行也应该是OK的。