追加のメソッドが追加された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;
}
}
}
ただし、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メソッドで何をしますか?
編集:完全な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();
}