2010-11-24 9 views
7

C#3.0では、intにnullを代入できますか?タイプ(?CLR int型に構造体です):nullで初期化されたC#値のタイプ

int? a = null; 

いますが、カスタム構造体を定義する場合:

MyStruct a = null; 

struct MyStruct 
{ 

} 

は、このコードのコンパイル時にエラーがありますエラーは次のとおりです。

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

int? CLRの構造体なので、私はそれにnullを代入することができます。 nullが暗黙のうちにキャストされているか、または証明書intにボックス化されているとしますか?ヌル値を表す値。どのように正確に行われますか?どのように私は行を実行することが可能であるような方法で体mystructを拡張することができます。

MyStruct a = null; 

答えて

19

にですint?が実際Nullable<int>速記ですので。あなたもあなたのタイプのために同じことを行うことができます。

MyStruct? a = null; 

nullのみ暗黙的に参照型または任意のNULL可能値の型を意味NULL値可能タイプに変換することができます - いくつかのTのために、後者の手段Nullable<T>

nullからCONVERするこの能力は本当に言語機能であることに注意してください - コンパイラは、この変換されます。

int? a = new int?(); 

int? a = null; 

を彼らは同じことを意味 - 基本的に "ヌル値タイプのnull値は、HasValueがfalseの値です。これはデフォルトで設定されます。ヌルと同じではありません参照 - ボクシングのヌル値はとなりますが、の結果はヌル参照になります。

(これは言語、ライブラリ、およびCLRの境界をまたぐ機能の1つの例です。ライブラリの部分は非常に単純ですが、CLRの部分はボクシングとアンボクシングのみですが、持ち上げられた演算子

+0

この質問の興味深いタイミング。私はJonの本(C#in Depth)のnullable型についての章を読んでいます。すべてのC#開発者はそれを読むべきです!ありがとうジョン。 – Bryan

+0

私はちょうど私がそのコメントを支払っていないことを指摘したいと思います:) –

+0

あなたの声明「これは本当に言語機能であることに注意してください」は、CLR *が*(後で述べるように) 'Nullable <>'はボクシングとアンボクシングの操作において特別に構造化されています。IMHOはこれをランタイム機能にしています(いくつかの '?' – Lucero

2

構造体は参照型ではないC#の値型なので、nullにすることはできません。

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); 

} 
+1

まあ 'MyStruct? 'はまだ値型ですが、nullでもかまいません。 –

+3

すべての構造体が不変ではありません(残念ながら)。 –

+0

@ジョン:私は構造体が価値によって渡されたと思ったが、どのように不変ではないのだろうか? –

1

ちょうど追加、null許容型は、基礎となる値型の値の正常範囲を表す、と追加することができヌル値。

表記では、intが実際にInt32であり、intではないのと同じですか? signはnullを意味します。 この場合はnullです。

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

関連する問題