1 回答

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超5個(gè)贊
長(zhǎng)話短說
您不能將某些內(nèi)容強(qiáng)制轉(zhuǎn)換為運(yùn)行時(shí)指定的未知類型。這意味著在您的代碼中,您不知道對(duì)象的屬性或方法是什么,除非您使用更多的反射。在那種情況下,鑄造它的意義何在?
有時(shí)我們處理直到運(yùn)行時(shí)才知道的類型。但是除非類型真的無關(guān)緊要,否則對(duì)象是無用的,除非我們可以將它轉(zhuǎn)換為代碼中指定的某種預(yù)定類型,而不是在運(yùn)行時(shí)。
在這行代碼中:
var val = property.GetValue(obj);
的聲明類型val由編譯器推斷。該類型是object因?yàn)檫@是GetValue返回的類型。對(duì)象的實(shí)際類型可以是string, int, List<Foo>, 等等。但是你有一個(gè)valtype的變量object。
如果你能這樣做:
var val = property.GetValue(obj) as runtimeType;
那么編譯時(shí)類型val是什么?它怎么可能有任何值,因?yàn)樗黵unTimeType是一個(gè)運(yùn)行時(shí)值?除非您可以調(diào)用方法或檢查其屬性,否則該對(duì)象是無用的。但是你不能在不知道類型的情況下這樣做,除非你使用更多的反射。但是,如果您打算這樣做,那么施放它就沒有意義了。
在您發(fā)布的代碼下游的某處,您可能想要實(shí)際對(duì)涉及其方法或?qū)傩缘膶?duì)象執(zhí)行某些操作。這意味著知道您認(rèn)為它是什么類型并將其轉(zhuǎn)換為該類型。那將是您的代碼中指定的類型,而不是在運(yùn)行時(shí)確定的類型。
例如:
var val = property.GetValue(obj); // I know this is a string
var myString = (string)val;
var findX = myString.IndexOf("X");
我認(rèn)為它是一個(gè)string所以我把它作為一個(gè)string。(那里可能有額外的檢查。)現(xiàn)在我已經(jīng)轉(zhuǎn)換了它,我有一個(gè)聲明為 type 的變量,string我可以將它用作字符串。(除非它不是string- 然后它會(huì)拋出運(yùn)行時(shí)異常。)
這就是強(qiáng)制轉(zhuǎn)換的好處 - 它允許我們將某些內(nèi)容分配給具有我們指定類型的強(qiáng)類型變量,然后相應(yīng)地使用它。轉(zhuǎn)換為未知類型對(duì)我們沒有好處。
冒著增加混亂的風(fēng)險(xiǎn):有人可能會(huì)說泛型表示運(yùn)行時(shí)未指定的類型,但事實(shí)并非如此。List<T>沒有指定是什么T,但是如果您List<T>以某種方式在某處創(chuàng)建一個(gè) ,您將在代碼中指定類型。在絕大多數(shù)正常場(chǎng)景中,我們必須知道一些關(guān)于對(duì)象類型的信息,否則該對(duì)象對(duì)我們來說是無用的。
- 1 回答
- 0 關(guān)注
- 161 瀏覽
添加回答
舉報(bào)