2013-08-14 2 views
9

Я получаю предупреждение анализа кода, которое кажется ложным.False Предупреждение CA1812: «внутренний класс, который, по-видимому, никогда не был создан ...»

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.

Как избавиться от этого предупреждения? Я предпочитаю не подавлять предупреждения, если я не уверен, что в противном случае я не мог бы этого избежать.

Классы выглядеть следующим образом:

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

ли это использование не считается конкретизацией?

+5

Является ли 'GetMyPrivateClasses()' сам определенно называется? (Не считается, если он вызван только косвенно из другого частного метода, который никогда не назывался сам) –

+0

@MatthewWatson Да, определенно. Мой код работает правильно, и этот конкретный метод является основной частью моего отчета, так что да. –

+0

Даже если он вызывается, неясно, будет ли экземпляр создаваться, поскольку этот метод возвращает запрос без его выполнения (например, с помощью 'ToList'). –

ответ

15

Я предполагаю, что он изучает ИЛ; и действительно - что IL никогда не содержит команду new MyPrivateClass - потому что этот оператор предположительно работает против IQueryable<T>, следовательно, lambda является деревом выражений . Он будет содержать некоторые Expression.New, а некоторые typeof(MyPrivateClass) - но не new MyPrivateClass.

В этом случае ошибка вводит в заблуждение. Просто подавите его.

+2

Это явно сказано в предупреждающем описании явно: http://msdn.microsoft.com/en-us/library/ms182265.aspx – BartoszKP

0

Измените свой класс на внутренний или общедоступный, что решает проблему. В любом случае, вы можете извлечь свой внутренний класс из внешнего класса ...

Смежные вопросы