Question

I am getting a code analysis warning that seems to be a false-positive.

CA1812 : Microsoft.Performance : 'MyClass.MyPrivateClass' is an internal class that is apparently never instantiated. If so, remove the code from the assembly. If this class is intended to contain only static methods, consider adding a private constructor to prevent the compiler from generating a default constructor.

How do I get rid of this warning? I prefer to not suppress warnings unless I am sure I couldn't avoid it otherwise.

The classes look like this:

namespace Some.Namespace
{
    public class MyClass
    {
        private class MyPrivateClass
        {
            public int Id { get; set; }
            public ModelObject { get; set; }
        }
    }
}

I use it like this:

private IQueryable<MyPrivateClass> GetMyPrivateClasses()
{
    return this.Repository().All()
        .Select(m => new MyPrivateClass { Id = m.Id, ModelObject = m };
}

Does this usage not count as instantiation?

Was it helpful?

Solution

I guess it is examining the IL; and genuinely - that IL does not ever contain a new MyPrivateClass instruction - because that statement is presumably running against IQueryable<T>, hence that lambda is an expression tree. It will contain some Expression.New, and some typeof(MyPrivateClass) - but no new MyPrivateClass.

In this case, the error is misleading. Simply suppress it.

OTHER TIPS

Change your class to internal or public, that solves the problem. Anyway, you can extract your inner class from the outer class...

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top