簡體   English   中英

為什么我不能執行動作 <Int32> 采取行動 <Object> ?

[英]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傳遞aObjint之外的任何內容,則會得到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM