4

私ができるほとんどのオブジェクトについて、

obj.getType().FullName

しかし、次のコードでは、

static void Main(string[] args)
        {
            IEnumerable<int> em = get_enumerable();
            Console.WriteLine(em.GetType());
            Console.Read();
        }

        static IEnumerable<int> get_enumerable()
        {
            for (int i = 0; i < 10; i++)
            {
                yield return i;
            }
        }

出力は、

ConsoleApplication1.Program+d__0

ここで、ConsoleApplication1 はアセンブリで、Program はクラスを含んでいます (表示されていません)。IEnumerable が表示されないのはなぜですか? この場合、GetType をよりわかりやすいものにするにはどうすればよいですか?

4

2 に答える 2

7

IEnumerable<T>オープン ジェネリック型です。これは実際の型ではありません。のような具体的な (クローズド) ジェネリック型を構築する単なる関数ですIEnumerable<int>

IEnumerable<int>インターフェイスです。インターフェイスのインスタンスを持つことはできません。

反復子関数は、実際には、コンパイラによって生成された隠しクラスのインスタンスを返しますIEnumerable<int>。それはあなたがから見ているものですGetType()

IEnumerable<T>型の実装のジェネリック型パラメーターを見つけたいとします。

em.GetType().GetInterface("System.Collections.Generic.IEnumerable`1")
            .GetGenericArguments()[0]
于 2013-07-01T15:41:52.620 に答える
2

IEnumerableはインターフェイスですが、実装するインターフェイスではなく、オブジェクトのクラスを表すGetTypeを返します。System.Type

を使用するyield returnと、C# コンパイラは(および)ConsoleApplication1.Program+d__0を実装する新しいクラス (この場合は名前付き) を自動的に生成します。IEnumerable<int>IEnumerable

于 2013-07-01T15:42:30.250 に答える