检测可空类型

时间:2011-08-31 11:04:12

标签: c# nullable

当它为空时,是否可以检测到Nullable类型(强制转换为对象)?

由于Nullable<T>实际上是一个结构,我认为它应该是可能的。

double? d = null;
var s = GetValue(d); //I want this to return "0" rather than ""

public string GetValue(object o)
{
    if(o is double? && !((double?)o).HasValue) //Not working with null
       return "0";
    if(o == null)
       return "";
    return o.ToString();
}  

5 个答案:

答案 0 :(得分:5)

你有每个Nullable类型的GetValueOrDefault方法,这还不够吗?

答案 1 :(得分:5)

http://msdn.microsoft.com/en-us/library/ms228597(v=vs.80).aspx

  

如果对象是基于可空类型的对象,则仅对其进行装箱   非空。如果HasValue为false,则代替装箱,而不是装箱   引用只是指定为null。

  

如果对象为非null - 如果HasValue为true - 则装箱   place,但只有可以为null的对象所基于的底层类型   盒装。

所以你有doublenull

public string GetValue(object o)
{
    if(o == null) // will catch double? set to null
       return "";

    if(o is double) // will catch double? with a value
       return "0";

    return o.ToString();
} 

答案 2 :(得分:3)

您的方法当前需要object,这意味着可以为空的值加框...并且将不再是可以为空的值。 o的值要么是非可空类型的盒装值,要么是空引用。

如果可能的话,将您的方法更改为通用:

public string GetValue<T>(T value)
{
    // Within here, value will still be a Nullable<X> for whatever type X
    // is appropriate. You can check this with Nullable.GetUnderlyingType
}

答案 3 :(得分:0)

如果onull,则o is double?将为false。无论输入参数double? d

的值如何

答案 4 :(得分:-1)

根据我的理解,如果你试图检测任何对象是否可以为空,这可以很容易地编写。

试试这个......

public static bool IsNullable(dynamic value)
{
    try
    {
        value = null;
    }
    catch(Exception)
    {
        return false;
    }
    return true;
}

简单!