Приведение 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>();