いいえ、これについて心配する必要はありません。
それらが実装を返すという事実IDisposable
は、実装の詳細です。これは、C# コンパイラの Microsoft 実装の反復子ブロックが、と の両方を実装する単一の型をたまたま作成するためです。後者は extendsです。それがあなたがそれを見ている理由です。IEnumerable<T>
IEnumerator<T>
IDisposable
これを示すサンプル コード:
using System;
using System.Collections.Generic;
public class Test
{
static void Main()
{
IEnumerable<int> foo = Foo();
Console.WriteLine(foo is IDisposable); // Prints True
}
static IEnumerable<int> Foo()
{
yield break;
}
}
が実装されていることに注意する必要があることに注意してください。したがって、明示的に反復するときはいつでも、適切に破棄する必要があります。たとえば、何かを反復処理して、常に値があることを確認したい場合は、次のようなものを使用できます。IEnumerator<T>
IDisposable
using (var enumerator = enumerable.GetEnumerator())
{
if (!enumerator.MoveNext())
{
throw // some kind of exception;
}
var value = enumerator.Current;
while (enumerator.MoveNext())
{
// Do something with value and enumerator.Current
}
}
(foreach
もちろん、ループはこれを自動的に行います。)