1 回答

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊
即使你的Template類繼承自Template<double>,它也不一樣??紤]您將更改的定義Template如下:
public class Template : Template<double>
{
public int AddedMember { get; set; }
}
現(xiàn)在,您嘗試執(zhí)行前面的代碼。您正在嘗試將具有某些屬性的類轉(zhuǎn)換為具有更多屬性的類 - 您將訪問內(nèi)存中不正確的位置!
您始終可以將類轉(zhuǎn)換為其基類,因?yàn)轵?qū)動(dòng)類包含所有基類的成員。因此,不需要顯式轉(zhuǎn)換。但是,當(dāng)您嘗試將基類轉(zhuǎn)換為驅(qū)動(dòng)類時(shí),只有當(dāng)基類變量指向驅(qū)動(dòng)類的實(shí)例時(shí),轉(zhuǎn)換才會(huì)成功,因此,驅(qū)動(dòng)類的所有成員都存在。如果否,InvalidCastException則在運(yùn)行時(shí)拋出遺囑。因此,需要顯式轉(zhuǎn)換(因?yàn)槭褂蔑@式轉(zhuǎn)換的準(zhǔn)則之一是在轉(zhuǎn)換可能失敗時(shí)使用顯式轉(zhuǎn)換)。
因此,如果您將代碼更改為變量 a(類型Template<double>),則轉(zhuǎn)換將成功:
Template<double> a = new Template();
Template b = (Template)a; // No exception will thrown
最后的代碼會(huì)成功,因?yàn)樽兞縜指向的Template(而不是Template<double>)的實(shí)例,所以我們確定(在運(yùn)行時(shí))所有的成員Template都存在并且不會(huì)發(fā)生錯(cuò)誤。
編輯:
你說出你的要求后,我可以幫你。你想要什么?您想啟用“模板”到“模板”的轉(zhuǎn)換 - 這可以通過 [用戶定義的轉(zhuǎn)換](https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/statements-expressions -運(yùn)營商/轉(zhuǎn)換運(yùn)營商)。
但是,不允許在驅(qū)動(dòng)類和基類之間進(jìn)行自定義轉(zhuǎn)換。所以,有兩種解決方案:
Template不會(huì)繼承自Template<double>,如下所示:
public class Template<T>
{
public T Value { get; set; }
}
public class Template
{
public double Value { get; set; }
public static explicit operator Template(Template<double> generic) // Or implicit instead of explicit
{
return new Template { Value = generic.Value };
}
}
var generic = new Template<double> { Value = 1234.56 };
var nongeneric = (Template)generic; // Or Template nongeneric = generic; if the conversion defined as implicit
您不會(huì)定義自定義轉(zhuǎn)換,而是定義一個(gè)常規(guī)方法(我定義了一個(gè)構(gòu)造函數(shù)):
public class Template<T>
{
public T Value { get; set; }
}
public class Template : Template<double>
{
public Template(Template<double> generic)
{
this.Value = generic.Value;
}
}
var generic = new Template<double> { Value = 1234.56 };
var nongeneric = new Template(generic);
- 1 回答
- 0 關(guān)注
- 244 瀏覽
添加回答
舉報(bào)