最近在論壇上看到有網友問到C#中對象強轉的問題,自己雖然接觸過C#,但對這個特性還是第一次接觸,所以這裡找到一些資料與大家一起分享。
一、代碼
[csharp]
class Program
{
static void Main(string[] args)
{
A a = new A();
B b =new B();
b.a = 300;
b.b = 20;
B e = a.Clone() as B;//這裡會運行錯誤 但是變成b.clone() as B 就會正常
System.Console.WriteLine(e.a);
}
}
public class A : ICloneable
{
public A()
{
}
public int a=200;
#region ICloneable 成員
public virtual object Clone()
{
return MemberwiseClone();
}
#endregion
}
public class B:A
{
public int b = 10;
public B():base()
{
}
public override object Clone()
{
B c= base.Clone() as B;//為什麼這裡可以把基類變成派生類?????????
c.b = 100;
return c;
}
}
class Program
{
static void Main(string[] args)
{
A a = new A();
B b =new B();
b.a = 300;
b.b = 20;
B e = a.Clone() as B;//這裡會運行錯誤 但是變成b.clone() as B 就會正常
System.Console.WriteLine(e.a);
}
}
public class A : ICloneable
{
public A()
{
}
public int a=200;
#region ICloneable 成員
public virtual object Clone()
{
return MemberwiseClone();
}
#endregion
}
public class B:A
{
public int b = 10;
public B():base()
{
}
public override object Clone()
{
B c= base.Clone() as B;//為什麼這裡可以把基類變成派生類?????????
c.b = 100;
return c;
}
}
二、解釋
1、解釋“B e = a.Clone() as B;//這裡會運行錯誤 但是變成b.clone() as B 就會正常”
你實例化是二個對象,而父類中沒有關於子類的對象相關的內存,無法轉
這段代碼代碼的分析很簡單:
a.Clone()得到的仍然是一個A類型的對象。A是基類,沒有B類的內存,所以基類是無法強制轉換成派生類的。
b.Clone()得到的就B類型的對象了。所以可以AS B。
給你一個例子:
[csharp]
A a = new A();
B b = new B();
A a2 = b; //這是可以的。
B b2 = a2 as B; //這種強制轉換也是可以成功的。
A a = new A();www.2cto.com
B b = new B();
A a2 = b; //這是可以的。
B b2 = a2 as B; //這種強制轉換也是可以成功的。
2、解釋“B c= base.Clone() as B;//為什麼這裡可以把基類變成派生類????????? ”
這是因為你實例化的對象本身就是B,B相當包含A存在.所以可以轉。
變量a不論你聲明為什麼類型,它指向一個A類對象。變量b不論你聲明什麼類型,它指向一個B類對象。不是說“可以把基類變成派生類”這種把類型類型和對象本身混淆起來,而是對象b既“是”A類對象也“是”B類對象,也就是說
if(b is A && b is B)
return true;
你可以試試看,這返回true。