在object参数中传递时如何区分(object)null和(decimal?)null?

时间:2016-05-24 13:29:42

标签: c# .net null nullable

我创建了一个测试代码snippet,展示了我想要实现的目标。但它没有按预期工作(参见代码中的注释):

public class Program
{
    public static void Main()
    {
        object obj = null;
        decimal? nullDecimal = null;

        Test(obj);         // Expected: Something else, Actual: Something else
        Test(nullDecimal); // Expected: Nullable decimal, Actual: Something else
    }

    public static void Test(object value)
    {
        if (value is decimal)
        {
            Console.WriteLine("Decimal");
            return;
        }

        if (value is decimal?)
        {
            Console.WriteLine("Nullable decimal");
            return;
        }

        Console.WriteLine("Something else");
    }
}

甚至可以在.NET中使用吗?

1 个答案:

答案 0 :(得分:3)

在您的示例中,无法确定它是object还是decimal?。在这两种情况下,只传递null引用,而不是类型信息。您可以使用泛型捕获类型信息:

public static void Main()
{
    object obj = null;
    decimal? nullDecimal = null;

    Test(obj);         // prints Something else
    Test(nullDecimal); // prints Nullable decimal
}

public static void Test<T>(T value)
{
    if (typeof(T) == typeof(decimal))
    {
        Console.WriteLine("Decimal");
        return;
    }

    if (typeof(T) == typeof(decimal?))
    {
        Console.WriteLine("Nullable decimal");
        return;
    }

    Console.WriteLine("Something else");
}

这样,无论您传递的值是否为null,都会自动捕获编译时类型。