-1

重複の可能性:
ジェネリック型をデフォルト値と比較するにはどうすればよいですか?

渡されたオブジェクトが空かどうかをテストする必要がある汎用関数があります。しかし、それはジェネリック型であるため、コンパイラーはクラスまたは構造体が渡されたかどうかを知りません。このため、null をテストすることはできません。型が空かどうかをテストする必要があります。

    public virtual void SetFocusedObject(T obj)
{
    //since we dont know if T is a class or a struct test against default
    T defaultT = default(T);

    if(obj != defaultT)
    {
        //code      
    }
}

これは機能しません。これは、コンパイラがテストをコンパイルできる T を認識していないためです。

代わりに、次のことも試しました

    public virtual void SetFocusedObject(T obj)
{
    //since we dont know if T is a class or a struct test against empty type
    T defaultT = T.GetConstructor(T.EmptyTypes).Invoke(null);

    if(obj != defaultT)
    {
        //code  
    }
}

そして、まったく同じ理由で、これも機能しません。誰かがうまくいく方法を提案してくれることを望んでいました。

4

2 に答える 2

0

それは総称関数ではありません。関数が「T」という名前の型引数を持つジェネリッククラスのメンバーでない限り、次のように宣言する必要があります。

public virtual void SetFocusedObject<T>(T obj)

default(T)これにより、正常に使用できるようになります。

public virtual void SetFocusedObject<T>(T obj)
{   
    if (obj.Equals(default(T))) return;

    //code      
}
于 2012-10-11T16:30:38.840 に答える
0

空の参照オブジェクトが意味nullし、構造体とnullを比較すると、次のようになりますfalse。これをテストとして使用してみませんか。

    public static void Test<T>(T obj)
    {
        if (obj == null) // default refernce type (which is null)
        {
            Console.WriteLine("default!");
        }
        else if(obj.Equals(default(T))) // default value types
        {
            Console.WriteLine("default!");
        }
    }
    public static void Main()
    {
        object o = null;
        Test(o); // test detects default
        Test(0); // test detects default
        Class1 c = new Class1();
        Test(c); // test does not detect default
    }

参照型のデフォルト値を検討nullするかどうか、またはデフォルトの参照型インスタンスがデフォルトのコンストラクターによって作成されたものであるかどうかを知りたいかどうかはわかりませんが。

于 2012-10-11T16:41:19.983 に答える