2

この問題は、この質問に答えようとしたときに発生しました。

https://stackoverflow.com/questions/12434634

プロパティのドキュメントには次のように記載されていType.IsEnumます。

現在のTypeがジェネリック型またはジェネリックメソッドの定義の型パラメーターを表す場合、このプロパティは常にfalseを返します。

しかし、私はこの振る舞いを見ていません。 typeof(T).IsEnumを返してtrueいます。なんで?ドキュメントを誤解していますか?

サンプルコード:

using System;

static class Program
{
    public static void Test<TEnum>() where TEnum : struct
    {
        Console.WriteLine(typeof(TEnum).IsEnum);
    }

    public static void Test<TEnum>(this string text) where TEnum : struct
    {
        if (!typeof(TEnum).IsEnum)
        {
            Console.WriteLine("Not an enum");
            return;
        }

        Console.WriteLine("Is an enum");
    }

    public enum Test1
    {
        Value1,
        Value2,
    }

    public enum Test2 : byte
    {
        Value3,
        Value4,
    }

    static void Main(string[] args)
    {
        Test<Test1>();
        Test<Test2>();
        "".Test<Test1>();
        "".Test<Test2>();
    }
}

私が得る結果は次のとおりです。

TrueTrue は列挙型
です 列挙型です

プロパティのドキュメントをType.IsEnum読んだ後、結果は次のようになると思います。

FalseFalse
列挙型 ではない
列挙型ではない

4

1 に答える 1

8

ドキュメントでは、オープンジェネリック型またはメソッドの型パラメーターを表す型オブジェクトについて説明しています。コードでは、閉じたジェネリックメソッドの型引数を表す型オブジェクトをクエリしています。もちろん、この例では、その型引数列挙型です。

言い換えると、ドキュメントはtypeof(List<>)、ではなく、でGetGenericArgumentsを呼び出すことで得られるタイプについて説明していますtypeof(List<SomeEnum>

于 2012-09-15T05:38:41.497 に答える