C# 检查params对象[]中的对象是否可为空<;T>; 使用系统; 使用System.IO; 班级计划 { 静态布尔值可为空(T) { 返回false; } 静态bool可为空(T?T),其中T:struct { 返回true; } 静态无效测试(参数对象[]objs) { 对于(int iter=0,limit=objs.Length;iter
我将一些数字作为C# 检查params对象[]中的对象是否可为空<;T>; 使用系统; 使用System.IO; 班级计划 { 静态布尔值可为空(T) { 返回false; } 静态bool可为空(T?T),其中T:struct { 返回true; } 静态无效测试(参数对象[]objs) { 对于(int iter=0,limit=objs.Length;iter,c#,C#,我将一些数字作为nullables传递给函数,以便将它们替换为nullif0以添加到DB。我认为这是一种简单而有意义的方法,无需创建新的数据类型。但是它不起作用 因此,我试图测试objs是否为Nullable类型可以这样做吗?当if进入params对象[]时,Nullable将转换为T 我肯定会使用自定义数据类型,但为什么它不能像我想的那样工作呢 PS:我对C#非常陌生,有两个问题 第一个是除了动态(您没有使用)之外,所有其他方法调用都在编译时解析。您对IsNullable(obj)的调用将始终
nullables
传递给函数,以便将它们替换为null
if0
以添加到DB。我认为这是一种简单而有意义的方法,无需创建新的数据类型。但是它不起作用
因此,我试图测试objs
是否为Nullable
类型可以这样做吗?当if进入params对象[]
时,Nullable
将转换为T
我肯定会使用自定义数据类型,但为什么它不能像我想的那样工作呢
PS:我对
C#
非常陌生,有两个问题
第一个是除了动态
(您没有使用)之外,所有其他方法调用都在编译时解析。您对IsNullable(obj)
的调用将始终调用IsNullable
version,因为obj
的静态类型只是object
第二个是可空类型有特殊的装箱规则(转换为object
):null
成为真正的空引用,非空值成为基础类型。在中无法区分o1
和o2
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));
}
}
我不知道你想做什么,所以我只能解释问题所在,不能提出任何替代方案。有两个问题 第一个是除了
动态
(您没有使用)之外,所有其他方法调用都在编译时解析。您对IsNullable(obj)
的调用将始终调用IsNullable
version,因为obj
的静态类型只是object
第二个是可空类型有特殊的装箱规则(转换为object
):null
成为真正的空引用,非空值成为基础类型。在中无法区分o1
和o2
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));
}
}
我不确定你想做什么,所以我只能解释错在哪里,不建议任何替代方案。更好的问题是,为什么你要使用对象数组而不是更具体的东西?尝试过了?@user3411327是的。也不起作用。直接引用:“where T:struct类型参数必须是值类型。可以指定除可为null以外的任何值类型。有关详细信息,请参阅使用可为null的类型(C#编程指南)。”(强调我的)等等,这样您基本上没有类型,但想知道它是否可为null。您的静态类型对象有空的东西?一个更好的问题是,为什么要使用对象数组而不是更具体的东西?尝试了吗?@user3411327是的。也不起作用。直接引用:“where T:struct类型参数必须是值类型。可以指定除可为null以外的任何值类型。有关详细信息,请参阅使用可为null的类型(C#编程指南)。”(强调我的)等等,这样您基本上没有类型,但想知道它是否可为null。您有静态类型为空的对象吗?谢谢。我知道如何解决这个问题。我只是想偷懒,然后。。。失败。通过测试了解了您在这里所说的内容,但希望得到更好的解释。另一个观点是,由于装箱的值存储在
对象
引用中,因此它始终可以为null。谢谢。我知道如何解决这个问题。我只是想偷懒,然后。。。失败。通过测试了解了您在这里所说的内容,但希望得到更好的解释。另一个观点是,由于装箱的值存储在对象
引用中,因此它始终可以为空。