2014-09-27 58 views
0
using System; 
using System.IO; 

class Program 
{ 
    static bool IsNullable<T>(T t) 
    { 
     return false; 
    } 
    static bool IsNullable<T>(T? t) where T : struct 
    { 
     return true; 
    } 
    static void Test(params object[] objs) 
    { 
     for (int iter = 0, limit = objs.Length; iter < limit; ++iter) 
     { 
      var obj = objs[iter]; 
      Console.WriteLine("{0}: {1}", iter, IsNullable(obj) ? "yes" : "no"); 
     } 
    } 
    static void Main(string[] args) 
    { 
     Test(new int?(100)); 
    } 
} 

我传递一些数字作为nullables的功能,因此它们与null取代,如果0添加到数据库。我认为这是一种简单而有意义的方式,不需要创建新的数据类型。但是...它不起作用。检查中params对象[]对象为空<T>

所以我试图测试objsNullable类型。 这可以做到吗?如果进入params object[],则Nullable<T>转换为T

我肯定会使用自定义的数据类型,但为什么这不工作,因为我认为它会?

PS我是非常新的C#

+0

更好的问题是为什么你使用对象数组而不是更具体的东西? – Stilgar 2014-09-27 19:06:54

+0

试过[Nullable.GetunderlyingType()](http://msdn.microsoft.com/de-de/library/system.nullable.getunderlyingtype(v = vs.110).aspx)? – user3411327 2014-09-27 19:07:13

+0

@ user3411327是的。不工作。 – CodeAngry 2014-09-27 19:09:03

回答

4

有两个问题。

第一个是,除了dynamic(您没有使用)之外,所有其他方法调用都在编译时解析。您拨打IsNullable(obj)总是请拨打IsNullable<object>版本,因为obj的静态类型只是object

第二种是可空类型有特殊的拳击规则(转换为object):null成为真空引用,非空值成为底层类型。有没有办法区分o1o2

object o1 = 100; 
object o2 = new int?(100); 

我不知道你想做什么,所以我只能解释什么是错的,不建议任何替代方案。

+0

**谢谢。**我知道如何解决它。我只是试图懒惰和失败。找出你在测试中所说的内容,但希望得到更好的解释。 – CodeAngry 2014-09-27 19:15:49

+1

另一个角度是,由于装箱值存储在'object'参考中,因此总是可以为空。 – 2014-09-27 19:24:15