// Needed for NET40 #if !NET_4_6 using System; using System.Collections; using System.Collections.Generic; using LinqInternal.Core; namespace LinqInternal.Collections.Specialized { internal class EnumerableFromDelegate : IEnumerable { private readonly Func> _getEnumerator; public EnumerableFromDelegate(Func getEnumerator) { // Specify the type arguments explicitly _getEnumerator = getEnumerator.ChainConversion>(ConvertEnumerator); } public IEnumerator GetEnumerator() { return _getEnumerator.Invoke(); } IEnumerator IEnumerable.GetEnumerator() { return _getEnumerator.Invoke(); } private static IEnumerator ConvertEnumerator(IEnumerator enumerator) { if (enumerator == null) { return null; } var genericEnumerator = enumerator as IEnumerator; if (genericEnumerator != null) { return genericEnumerator; } return ConvertEnumeratorExtracted(enumerator); } private static IEnumerator ConvertEnumeratorExtracted(IEnumerator enumerator) { try { while (enumerator.MoveNext()) { var element = enumerator.Current; if (element is T) { yield return (T)element; } } } finally { var disposable = enumerator as IDisposable; if (disposable != null) { disposable.Dispose(); } } } } } #endif