'is'运算符不能应用于静态类型的操作数

时间:2012-08-28 20:02:23

标签: c# nullable

这个错误在这种情况下意味着什么?

if (value == null)
    return "";

if (value is Nullable && ((INullable)value).IsNull) //error on this line
    return "";

if (value is DateTime)
{
    if (((DateTime)value).TimeOfDay.TotalSeconds == 0)
        return ((DateTime)value).ToString ("yyyy-MM-dd");
    return ((DateTime)value).ToString ("yyyy-MM-dd HH:mm:ss");
}

我搜索了但没有得到有关此错误的任何信息。我在Mono(2.10.8.1)上尝试这个。这是一个实际用于Windows的项目,但是当我尝试在Monodevelop中编译它时,我遇到了这个错误。

2 个答案:

答案 0 :(得分:7)

问题在于:

if (value is Nullable

它认为你在谈论static class System.Nullable而不是System.Nullable<T>结构。

也许你的意思是:

if (value is INullable ...)

请注意,如果value属于编译时类型object,那么永远不会成为Nullable<T>,因为装箱空值会给出一个null引用,装箱非空值将给出基础类型的盒装值。

如果您认为还有其他事情需要实现,请说明您的目标。

答案 1 :(得分:4)

类型System.Nullable是静态类型 - 这意味着无法创建实例。因此,value永远不能成为Nullable的一种类型。

Microsoft C#编译器没有此错误 - 因此,使用Visual Studio的任何人都不会收到此错误。因此,创建RedditSaveTransfer的人似乎使用了Visual Studio。在MonoDevelop中编译相同的内容显然有这个额外的错误。

我对这段代码一无所知,所以我不知道他们在这里尝试做什么的意图。显然,value永远不会是Nullable类型,因此整个if语句将始终为false。因此,我认为,从代码中删除块是安全的。

但是,基于代码看起来它正在尝试检查该值是否是某种SqlTypes.INullable。在这种情况下,我可能会做类似的事情:

INullable nullable = value as INullable;
if(nullable != null && nullable.IsNull)
   return "";

但是,这会产生与原始代码不同的结果;我不知道这是好事还是坏事。

我同意Jon的观点,这可能是value is INullable的错字;但是,我不确定。