Приведение Enumerable.Empty <> () в другой класс, реализующий IEnumerable, возвращает null

У меня есть класс, реализующий IEnumerable:

public class A { }
public class B : IEnumerable<A> { } 

Как я могу использовать класс B как Enumerable.Empty<A>()в этом случае? Я имею в виду такой кастингEnumerable.Empty<A>() as Bвозвращает null. Почему это так? Должен ли я реализовать какой-либо конкретный конструктор или метод? Или это запрещенная операция, и я должен сделать это по-другому?

1 ответ

Решение

Enumerable.Empty<T>()будет реализована как:

internal class EmptyEnumerable<T>
{
    public static readonly T[] Instance = new T[0];
}

public static IEnumerable<T> Empty<T>()
{
    return EmptyEnumerable<T>.Instance;
}

Если вы удалите оптимизацию для кеширования пустого массива, вы можете переписать это как:

public static IEnumerable<T> Empty<T>()
{
    return new T[0];
}

Так Enumerable.Empty<T>() просто возвращает пустой массив типа T.

Вы бы не написали:

B b = new A[0];

В этом нет смысла: B не массив экземпляров A.

По той же причине нельзя писать:

B b = Enumerable.Empty<A>();
Другие вопросы по тегам