检查params object []中的对象是否为Nullable <t> </t>

时间:2014-09-27 19:02:50

标签: c#

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,以便添加到数据库。我认为在不创建新数据类型的情况下,这是一种简单而有意义的方法。但是......它没有用。

因此,我尝试为objs类型测试Nullable可以这样做吗?如果进入Nullable<T>T会转换为params object[]

我肯定会使用自定义数据类型,但为什么这不符合我的想法?

PS 我对C#非常陌生。

1 个答案:

答案 0 :(得分:4)

有两个问题。

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

第二个是可空类型具有装箱的特殊规则(转换为object):null成为真正的空引用,非空值成为基础类型。无法区分

中的o1o2
object o1 = 100;
object o2 = new int?(100);

我不确定你要做什么,所以我只能解释错误,不建议任何替代方案。