24

我不明白。As运营商:

as 运算符用于在兼容的引用或可空类型之间执行某些类型的转换。

那么为什么以下工作?

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. 此处不涉及参考。

  • 这里当然没有可为空的类型。

关于我为什么错的任何解释?

4

3 回答 3

34

将其转换为接口将在托管堆上创建盒装副本,并返回对盒装副本的引用。盒子实现了接口。

于 2012-11-01T11:37:44.540 回答
9

它之所以有效,是因为右侧是一个界面。条件是右侧可以接受null作为值,即它是引用类型或可为空的值类型。接口是一种引用类型。在这种情况下,代码将对结构进行装箱,然后将装箱的对象转换为接口。

于 2012-11-01T11:38:28.980 回答
0

您只需使用引用类型可为ILive空值进行强制转换,因此不会引发错误。但是,如果您尝试使用此注释代码,则会收到错误消息。

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

这是因为您正在尝试转换as为值类型并且不能为空。

于 2012-11-01T12:42:48.173 回答