24

理解できません。Asオペレーター:

as 演算子は、互換性のある参照型または null 許容型の間で特定の型の変換を実行するために使用されます。

では、なぜ次のように動作するのでしょうか?

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ます。ここには参照は含まれていません。

  • ここには確かに null 許容型はありません。

なぜ私が間違っているのかについての説明はありますか?

4

3 に答える 3

34

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

于 2012-11-01T11:37:44.540 に答える
9

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

于 2012-11-01T11:38:28.980 に答える
0

参照型のILivenull 許容値でキャストするだけなので、エラーはスローされません。ただし、このコメント付きのコードを試すと、エラーが発生します。

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

これは、as値型にキャストしようとしていて、null にできないためです。

于 2012-11-01T12:42:48.173 に答える