CA1812错误警告:“;显然从未实例化的内部类&”;

本文关键字:实例化 内部类 警告 错误 CA1812 | 更新日期: 2023-09-27 18:27:40

我收到一个代码分析警告,似乎是假阳性。

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 };
}

这种用法不算实例化吗?

CA1812错误警告:“;显然从未实例化的内部类&”;

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

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

仅供参考,此警告有一个新的文档页面:

https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1812

类的实例化并不总是能被分析器识别。

如果合理,则取消此警告:

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1812:AvoidUninstantiatedInternalClasses", Justification = "generic/late bound/reflection")]

尤其发生在Net.Core中。

将类更改为内部类或公共类,即可解决问题。不管怎样,你可以从外部类中提取你的内部类。。。