1 回答

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