-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

如果您的意思是空的引用对象,null并且当您将 struct 与 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 回答
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 回答