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

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

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

```cpp
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' будет выглядеть следующим образом:

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

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