2012-11-01 15 views
24

私はそれを取得しません。 Asオペレータ:構造体のas演算子ですか?

The as operator is used to perform certain types of conversions between compatible reference or nullable types.

はなぜ、次の作業を行いますか?

struct Baby : ILive 
{ 
    public int Foo { get; set; } 

    public int Ggg() 
    { 
     return Foo; 
    } 
} 

interface ILive 
{ 
    int Ggg(); 
} 

void Main() 
{ 
    ILive i = new Baby(){Foo = 1} as ILive; // ?????? 
    Console.Write(i.Ggg());     // Output: 1 
} 
  • Babyそれはstackに価値を置くの作成、構造体です。 参照がここに含まれています。

  • ここにはヌル入力可能なタイプはありません。

なぜ私は間違っているのか?

+0

Btw、Babyのような可変オブジェクトは、貧弱な構造体を作ります。クラスがより明白な選択肢になります。 –

+0

@MarcGravell of course。この問題はエッジシナリオをより良く知るためのものです。 :-) –

答えて

34

インターフェイスとしてキャストすると、管理されたヒープにボックス化されたコピーが作成され、ボックス化されたコピーへの参照が返されます。ボックスはインターフェイスを実装します。

+0

インターフェイスがSystem.objectを継承しないという事実はありません。何か関係がありますか? –

+4

@RoyiNamirは少なくともありません。インタフェースは常に参照型であり、ジェネリックスをわずかに除いて*制限付き*型(参照型と値型の間の中間) –

9

右側がインターフェイスなので動作します。条件は、右側がnullを値として受け入れることができるという条件です。つまり、参照型またはnull値型です。インタフェースは参照型です。この場合、コードは構造体にボックスを入れ、ボックス化されたオブジェクトをインタフェースにキャストします。

+0

インタフェースの静的型を持つものはすべて参照です。値の型をインターフェイスにキャストすると、ボックス化されます(参照が与えられます)。したがって、この文脈では、それらを参照型と呼ぶことが正当です。 – CodesInChaos

+0

いつものように、「何か」に対する部分的な例外があります:インタフェースは、いくつかの「T」のジェネリック制約によって記述されたときです。 「制約された」部分は、変数が「T」のときにのみ適用されますが、インタフェース自体である場合は適用されません。 –

0

リファレンスタイプILiveでキャストするだけで、null値が返されるため、エラーはスローされません。しかし、このコメント付きコードを試してみると、エラーが発生します。

Baby b = new Baby(); 
object o = b; 
//Baby bb = o as Baby ; 

あなたが値型にasにキャストしようとしているためです、それはnullにすることはできません。

関連する問題