У меня есть объект LINQ с добавленным к нему дополнительным методом. У класса нет одноразовых свойств или методов, но FxCop вызывает ошибку «Типы, для которых должны быть одноразовые поля, одноразовые» и ссылается на этот класс.
Я сократил код до сих пор и все еще получаю ошибку:
partial class WikiPage
{
public PagePermissionSet GetUserPermissions(Guid? userId) {
using (WikiTomeDataContext context = new WikiTomeDataContext()) {
var permissions =
from wiki in context.Wikis
from pageTag in context.VirtualWikiPageTags
select new {};
return null;
}
}
}
Однако, если я удалю EITHER из предложений from, FxCop перестанет выдавать ошибку:
partial class WikiPage
{
public PagePermissionSet GetUserPermissions(Guid? userId) {
using (WikiTomeDataContext context = new WikiTomeDataContext()) {
var permissions =
from pageTag in context.VirtualWikiPageTags
select new {};
return null;
}
}
}
Или
partial class WikiPage
{
public PagePermissionSet GetUserPermissions(Guid? userId) {
using (WikiTomeDataContext context = new WikiTomeDataContext()) {
var permissions =
from wiki in context.Wikis
select new {};
return null;
}
}
}
PagePermissionSet не является одноразовым.
Это ложное срабатывание? Или код LINQ как-то генерирует одноразовое поле в классе? Если это не ложное срабатывание, FxCop рекомендует реализовать интерфейс IDisposable, но что мне делать в методе Dispose?
EDIT:
Полная ошибка FxCop:
"Реализация IDisposable на 'WikiPage', потому что это
создает члены следующих типов IDisposable:
'WikiTomeDataContext. Если «WikiPage» ранее
поставляется, добавление новых членов, которые реализуют IDisposable
к этому типу считается переломное изменение к существующему
потребители ".
Редактировать 2:
Это разобранный код, который вызывает ошибку:
public PagePermissionSet GetUserPermissions(Guid? userId)
{
using (WikiTomeDataContext context = new WikiTomeDataContext())
{
ParameterExpression CS$0$0001;
ParameterExpression CS$0$0003;
var permissions = context.Wikis.SelectMany(Expression.Lambda<Func<Wiki, IEnumerable<VirtualWikiPageTag>>>(Expression.Property(Expression.Constant(context), (MethodInfo) methodof(WikiTomeDataContext.get_VirtualWikiPageTags)), new ParameterExpression[] { CS$0$0001 = Expression.Parameter(typeof(Wiki), "wiki") }), Expression.Lambda(Expression.New((ConstructorInfo) methodof(<>f__AnonymousType8..ctor), new Expression[0], new MethodInfo[0]), new ParameterExpression[] { CS$0$0001 = Expression.Parameter(typeof(Wiki), "wiki"), CS$0$0003 = Expression.Parameter(typeof(VirtualWikiPageTag), "pageTag") }));
return null;
}
}
Редактировать 3:
Похоже, есть класс замыкания, содержащий ссылку на DataContext. Вот его разобранный код:
[CompilerGenerated]
private sealed class <>c__DisplayClass1
{
// Fields
public WikiTomeDataContext context;
// Methods
public <>c__DisplayClass1();
}