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
if
0
以添加到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。谢谢。我知道如何解决这个问题。我只是想偷懒,然后。。。失败。通过测试了解了您在这里所说的内容,但希望得到更好的解释。另一个观点是,由于装箱的值存储在
对象
引用中,因此它始终可以为空。