2016-01-22 54 views
0

我最近發現了dynamic-Datatype,它對於我目前正在使用的項目非常有用。現有陣列值的目標類型與新陣列值不匹配(動態)

這裏是我的一小段代碼:

    if (tempDyn != null) 
        { 
         termIndex[i] = tempDyn; 
        } 

雖然termIndex是一個動態數組和tempDyn是動態數據類型的。 在將termIndex [i]指定爲tempDyn的Val之前,它已經包含一個值。類型:字符串。 tempDyn的類型是object [],但我不會對可能特定於某個類型的值執行任何操作。

當分配正在發生運行時拋出異常:

ArrayTypeMismatchException 當試圖存儲陣列內的錯誤類型的元素時引發的異常。

我最初認爲這將通過使用動態數據類型來防止,但它是有道理的,運行時將第一個值輸入時形成動態數組爲字符串[]類型的數組。 (Split在termIndex上運行第一個)

有沒有辦法阻止這種行爲並將termIndex中的「odd」值存儲起來,還是需要使用更多變量/字典?

回答

2

編譯時間類型爲dynamic[]的數組不能確保數組能夠真正存儲任何類型的值,這只是表示編譯器不會執行任何類型檢查,而且這些只會在運行時完成。

個例:

dynamic[] array = new dynamic[2];  
array[0] = "blah"; 
array[1] = 1; 

這將運行得很好,array實例化一個 「真」 dynamic[]

進行對比:

dynamic[] array = new string[2];  
array[0] = "blah"; 
array[1] = 1; // <-- throws an ArrayTypeMismatchException! 

在這種情況下,array真的是一個string[]。將它存儲在dynamic[]變量中只是跳過編譯時類型驗證,但不會奇蹟般地允許您在數組中存儲任何內容。


作爲一般的經驗法則,您應該限制使用dynamic。動態變量在性能方面稍微昂貴一些,但這不是主要觀點。主要的問題是,通過使用不需要它們的動態特性,可以通過靜態輸入變量來放棄編譯器可以提供的所有幫助。你也失去了像智能感知或自動完成的好東西。

dynamic是一個很好的功能,當處理一個本質上是動態的源代碼時,例如json輸入,但不要過度使用它。

+0

這就是我一直在尋找,謝謝回答!我沒有顯式初始化數組爲dynamic [dimension],因爲我忽略了我看到Split的結果是動態數組的第一個用法。這樣就可以將它內部轉換爲字符串[]。這是我的概念失敗,但我現在知道如何解決它。感謝動態警告的建議,我知道缺陷的位置,但我嘗試在運行時調用對象的Invoke-Functions,因此它正是我這次需要的:)下一次我再次堅持傳統類型hehe。祝你有美好的一天! – prizm1

+0

的確,動態是通過反射「調用」的非常好的替代。 – Falanwe

1

我不確定你到底在想什麼。

提供更多的代碼,如變量的定義將有助於理解。

但現在聽起來更像是你想用列表來代替數組。

var termIndex = new List<dynamic>(); 

https://msdn.microsoft.com/en-us/library/6sh2ey19(v=vs.110).aspx

+0

我一定會試一試!這可能是解決方案,但如果我可以跟上對象,我會盡力做到這一點。感謝你! – prizm1