【问题标题】:Creating an empty generic object [duplicate]创建一个空的通用对象[重复]
【发布时间】:2012-10-12 05:52:22
【问题描述】:

可能重复:
How do I compare a generic type to its default value?

我有一个通用函数需要测试传入它的对象是否为空。但是因为它是泛型类型,编译器不知道传递的是类还是结构。因此,我无法测试 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  
    }
}

出于同样的原因,这也不起作用。我希望有人可以提出一种可行的方法。

【问题讨论】:

  • 究竟什么是“空”对象?
  • +1 反对反对票。这是一个重复的问题,但这是一个很好的问题。
  • 感谢您的链接,那里有很多很好的信息
  • 您实际上可以测试 null,但如果是结构体,该测试将始终返回 false。

标签: c# generics reflection


【解决方案1】:

这不是通用函数。除非该函数是具有名为“T”的类型参数的泛型类的成员,否则您需要像这样声明它:

public virtual void SetFocusedObject<T>(T obj)

这将允许您成功使用default(T)

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

    //code      
}

【讨论】:

  • No downvote 但是,不,你的例子没有编译(用VS2012测试)...
【解决方案2】:

如果空引用对象是指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 引用类型的默认值,或者您是否想知道默认引用类型实例是否是默认构造函数创建的实例。

【讨论】:

  • 不会,因为没有Class1定义,只是空类。
  • 现在,当我(显然)在 cmets 中提到的问题中看到更好的答案时,我发现它不会检测到设置了默认值的 Nullables。
  • 是的,到目前为止我找到的最佳答案是 if(EqualityComparer.Default.Equals(obj,default(T)))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-28
  • 2012-12-17
  • 2011-02-07
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多