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#
非常陌生。
答案 0 :(得分:4)
有两个问题。
第一个是除了dynamic
(您没有使用)之外,所有其他方法调用都在编译时解析。您拨打IsNullable(obj)
的电话将始终调用IsNullable<object>
版本,因为obj
的静态类型仅为object
。
第二个是可空类型具有装箱的特殊规则(转换为object
):null
成为真正的空引用,非空值成为基础类型。无法区分
o1
和o2
object o1 = 100;
object o2 = new int?(100);
我不确定你要做什么,所以我只能解释错误,不建议任何替代方案。