# V3194. Calling 'OfType' for collection will return an empty collection. It is not possible to cast collection elements to the type parameter.

Анализатор обнаружил ситуацию, когда в результате вызова 'OfType' будет возвращена пустая коллекция. Данное поведение обусловлено невозможностью преобразования типа элементов коллекции к типу, по которому фильтрует 'OfType'.

Рассмотрим пример:

    public struct SyntaxToken {....}
    public class InvocationExpressionSyntax : ExpressionSyntax {....}

    public List<SyntaxToken> GetAllTokens() {....}
    public List<ExpressionSyntax> GetAllExpressions() {....}

    void ProcessInvocationExpressions()
    {
      var result = GetAllTokens().OfType<InvocationExpressionSyntax>();
      ....
    }

В 'ProcessInvocationExpressions' должны обрабатываться объекты типа 'InvocationExpressionSyntax'. Для этого производится фильтрация коллекции с помощью метода 'OfType'. Однако данный метод вызывается на коллекцию элементов типа 'SyntaxToken'. В результате фильтрации будет получена пустая коллекция, так как экземпляры структуры 'SyntaxToken' точно не могут являться 'InvocationExpressionSyntax'.

В вышеописанном примере был перепутан метод для получения коллекции объектов типа 'ExpressionSyntax'. Вместо 'GetAllTokens' должен использоваться 'GetAllExpressions'. Корректная реализация 'ProcessInvocationExpressions' будет выглядеть следующим образом:

    void ProcessInvocationExpressions()
    {
      var result = GetAllExpressions().OfType<InvocationExpressionSyntax>();
      ....
    }

При такой реализации будет отфильтрована коллекция с элементами типа 'ExpressionSyntax'. Данный тип является базовым для 'InvocationExpressionSyntax'. Следовательно, преобразование из 'ExpressionSyntax' в 'InvocationExpressionSyntax' представляется возможным. В результате вызова 'OfType' может быть получена непустая коллекция.

Данная диагностика классифицируется как:

CWE-704