我正在阅读这个答案:https://stackoverflow.com/a/15209464/1073672 这是代码,为了完整而复制并略微简化。
using System;
namespace Test
{
interface IFoo
{
int Foobar{get;set;}
}
struct Foo : IFoo
{
public int Foobar{ get; set; }
}
class Bar
{
// These two lines. I can not understand how they will work.
Foo tmp;
public IFoo Biz{ get { return tmp; } set { tmp = (Foo) value; } }
public Bar()
{
Biz = new Foo(){Foobar=0};
}
}
class MainClass
{
// This is not really important.
public static void Main (string[] args)
{
var mybar = new Bar();
}
}
}
如何构建Bar
并分配给Biz
?
我的看法:
Foo()
的结构并设置其Foobar = 0; IFoo
类型(因为Biz
类型为IFoo
)IFoo
取消设置为值类型struct (Foo)
并分配给tmp。这个描述是否正确?即使我们不使用对象类,这实际上是un / boxing吗?
答案 0 :(得分:1)
您的描述是正确的。将struct
转换为接口会导致装箱。
一个有趣的副作用是分配给Bar.Biz.Foobar
不会导致任何变化:
var mybar = new Bar();
mybar.Biz.Foobar = 2;
int fooBar = mybar.Biz.Foobar; // still 0
可变struct
是邪恶的。