C# 错误CA1812警告:“显然从未实例化的内部类…”

C# 错误CA1812警告:“显然从未实例化的内部类…”,c#,code-analysis,C#,Code Analysis,我收到一条代码分析警告,似乎是误报 CA1812:Microsoft.Performance:“MyClass.MyPrivateClass”是一个显然从未实例化的内部类。如果是,请从程序集中删除代码。如果该类仅包含静态方法,请考虑添加私有构造函数,以防止编译器生成默认构造函数。 我如何摆脱这个警告?我宁愿不抑制警告,除非我确信我无法避免它 这些类如下所示: namespace Some.Namespace { public class MyClass { pri

我收到一条代码分析警告,似乎是误报

CA1812:Microsoft.Performance:“MyClass.MyPrivateClass”是一个显然从未实例化的内部类。如果是,请从程序集中删除代码。如果该类仅包含静态方法,请考虑添加私有构造函数,以防止编译器生成默认构造函数。

我如何摆脱这个警告?我宁愿不抑制警告,除非我确信我无法避免它

这些类如下所示:

namespace Some.Namespace
{
    public class MyClass
    {
        private class MyPrivateClass
        {
            public int Id { get; set; }
            public ModelObject { get; set; }
        }
    }
}
private IQueryable<MyPrivateClass> GetMyPrivateClasses()
{
    return this.Repository().All()
        .Select(m => new MyPrivateClass { Id = m.Id, ModelObject = m };
}
我是这样使用它的:

namespace Some.Namespace
{
    public class MyClass
    {
        private class MyPrivateClass
        {
            public int Id { get; set; }
            public ModelObject { get; set; }
        }
    }
}
private IQueryable<MyPrivateClass> GetMyPrivateClasses()
{
    return this.Repository().All()
        .Select(m => new MyPrivateClass { Id = m.Id, ModelObject = m };
}

这种用法不算作实例化吗?

我想它是在检查IL;实际上,IL从未包含新的MyPrivateClass指令,因为该语句可能是针对IQueryable运行的,因此lambda是一个表达式树。它将包含一些Expression.New和一些typeofMyPrivateClass,但不包含新的MyPrivateClass


在这种情况下,错误具有误导性。只需抑制它。

将类更改为internal或public即可解决问题。无论如何,您可以从外部类中提取内部类…

GetMyPrivateClasses本身是否被明确调用?如果它只是从另一个从未调用过的私有方法间接调用,则不算数itself@MatthewWatson当然可以。我的代码运行正常,这个方法是我报告的核心部分,所以是的。即使调用了它,也不清楚该类是否会被实例化,因为该方法返回一个查询而不执行它(例如,通过使用ToList)。如果查询的结果被具体化,并且至少有一个结果,则该类将被实例化,但由于中间有一个存储库,因此无法静态地证明它。因此,你可能应该抑制这个警告,并在你未来的自我中添加一条解释原因的注释。或者,您也可以用元组替换自定义类,尽管这种治疗方法比疾病更糟糕。使用[System.Diagnostics.CodeAnalysis.SuppressMessageMicrosoft.Performance,CA1812:AvoidUninstantiatedInternalClasses,Justification=Late bound]。在反射方面也有同样的问题。警告描述中甚至明确指出:抑制此警告的语法是什么?我让它起作用,但在警告消失之前必须重新启动VS2019。pragma warning disable CA1812//类用于JSON反序列化。。。。pragma warning restore CA1812在抑制警告后,必须构建项目或重新启动VS,正如@ThorkilVærge指出的那样,警告将消失。这显然会改变类的预期私有可见性-如果类保持私有或内部,这不是一个解决方案。