[英]Why cant i cast an Action<Int32> to Action<Object>?
我在幾個地方都使用了Action<Int32>
, Action<Boolean>
, Action<SomeClassName>
,但是在類方法中將動作作為參數傳遞時,我無法轉換Action<Int32>
或Action<Boolean>
到Action<Object>
。
為什么簡單類型轉換不能完成轉換? 這完全有可能嗎? 最后,如果可能的話,我將如何進行這個演員表。
因為這樣會破壞類型的安全性。
聲明Action<Int32>
,您說“這是一個需要一個Int32參數的委托”。
如果可以將其直接轉換為Action<object>
,那么您現在可以使用絕對不是Int32
東西(例如DateTime
調用該動作。 在這種情況下,C#會阻止您用腳射擊。
您不能通過協方差直接轉換(或者它是協方差嗎?),因為Action<int>
本質上不是 Action<object>
-后者可以傳遞任何對象,而前者只能傳遞int
。
您可以通過包裝動作來解決此問題,例如:
Action<int> aInt = ...;
Action<object> aObj = o => aInt((int)o);
這再次向您顯示了為什么aObj
可能不是一個好主意-如果將aObj
傳遞aObj
除int
之外的任何內容,則會得到aObj
異常。
相反,從理論上講,您可以將Action<object>
轉換為Action<int>
,因為如果可以將任何對象傳遞給它,則可以肯定地將其傳遞給int
。 但是,實際上,這僅適用於引用類型,不適用於值類型-因此您可以使用string
,而不能使用int
。
Action在其輸入為Int32的限制下工作。 這意味着您使用的操作可以假設輸入為int。 例如,您可以使用另一個int n => Console.WriteLine(n + 4)
進行數學運算。 因此該動作或功能非常適合該框。 如果更改此框,則先前的假設仍然成立。 你基本上具有反向關系,或逆變 ,到“常規”鑄造的情況下,例如: object a = (object) 2;
。
只需記住,“操作”框中包含的所有內容都無需對其輸入行為進行任何假設。 函數n => Console.WriteLine(n)
恰好適合內部,因為可以打印所有對象。 並非所有對象都可以像int一樣工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.