代码之家  ›  专栏  ›  技术社区  ›  bitbonk

非常时髦的C#编译器行为,可为空的文本

  •  1
  • bitbonk  · 技术社区  · 16 年前

    C#4.0编译器对此没有抱怨(甚至没有警告):

    if(10.0 > null + 1)
    {       
    }
    
    if (myDoubleValue > null)
    {
    }
    

    似乎总是假的。这是怎么回事?为空自动转换为 Nullable<double> 或者别的什么?

    如果是这样的话,为什么这不起作用呢

    double myDoubleValue = null + 1;
    

    还有,为什么我会想要这样的行为。为什么可以用这样的文字来玩弄是件好事呢。

    2 回复  |  直到 16 年前
        1
  •  8
  •   Jon Skeet    16 年前

    double? ,不是 double 加倍? (又名 Nullable<double> )类型。

    哦,前两个街区都是 应该 让编译器抱怨,警告如下:

    测试.cs(7,19):警告CS0458: “int”类型的“null”
    测试.cs(12,13): 键入“double?”总是产生“假”

    设法编译而不出错并不等于不抱怨:)

        2
  •  2
  •   Darin Dimitrov    16 年前
    if(10.0 > null + 1)
    {
    
    }
    

    实际上相当于:

    int? i = null + 1; // i.HasValue = false in this case
    if(10.0 > i)
    {
    
    }
    

    所以您实际上是在尝试将不可为null的类型与没有值的可为null的类型进行比较。

    double myDoubleValue = null + 1;
    

    int? 而不是 double .

    另外,这个问题是出于好奇,试图#%=^编译器,还是你真的在一个真实的项目中写这样的东西?

    推荐文章