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

C值类型初始化为空

  •  7
  • mgamer  · 技术社区  · 14 年前

    在C#3.0中,可以将空值赋给int?键入(在CLR int?是结构):

    int? a = null;
    

    但是,当您定义自定义结构时:

    struct MyStruct
    {
    
    }
    

    编译此代码时出错:

    MyStruct a = null;
    

    错误如下:

    Cannot convert null to 'Example.MyStruct' because it is a non-nullable value type
    

    当内景?是CLR中的一个结构,我们可以给它赋值为空,这有点违反直觉。 我认为空值是隐式地被投射到一个特定的int上还是被装箱到一个certian int上?表示空值的值。具体是怎么做到的?我如何扩展MyStruct以便能够执行该行:

    MyStruct a=空;
    
    3 回复  |  直到 14 年前
        1
  •  20
  •   Jon Skeet    14 年前

    是因为 int? 实际上是速记 Nullable<int> . 你也可以为你的类型做同样的事情:

    MyStruct? a = null;
    

    null 只能隐式转换为 可为空 类型,这意味着任何引用类型或任何可以为空的值类型,后者意味着 Nullable<T> 对一些人来说 T .

    请注意,这种从 无效的 真的是 语言 功能-编译器正在转换:

    int? a = null;
    

    进入之内

    int? a = new int?();
    

    它们的意思是相同的-基本上,对于可为空的值类型,一个“空”值是 HasValue 是false,默认情况下为false。这和空值不一样 参考 -虽然装箱一个空值 导致引用为空。

    (这是跨语言、库和CLR边界的特性的一个示例。库部分很简单,CLR部分只与装箱和解包有关,但在语言中提升操作符等方面有很多。

        2
  •  2
  •   Master Morality    14 年前

    结构是C#中的值类型,而不是引用类型,因此它们不能为空。

    MyStruct? = null;
    

    可以工作,但请记住结构是不可变的,例如:

    public struct Point 
    {
       public int x, y;
    
       public Point(int p1, int p2) 
       {
           x = p1;
           y = p2;    
       }
    }
    
    void Main()
    {
    
        //create a point
        var point1 = new Point(10, 10); 
    
        //assign point2 to point, point2
        var point2 = point1; 
    
        //change the value of point2.x
        point2.x = 20; 
    
        //you will notice that point1.x does not change
        //this is because point2 is set by value, not reference.
        Console.WriteLine(point1.x);
        Console.WriteLine(point2.x);
    
    }
    
        3
  •  1
  •   marcelo-ferraz    14 年前

    只需添加,可为空的类型可以表示其基础值类型的正常值范围,外加一个空值。

    在记数法中,正如int实际上是Int32,而不是任何int,the?符号表示可为空。 在这种情况下,可以为空。

    http://msdn.microsoft.com/en-us/library/1t3y8s4s%28VS.80%29.aspx

    推荐文章