[英]Variance in Func<> arguments
我一直在嘗試做類似的事情
Func<string, bool> f
Func<object, bool> F = f;
並且編譯器引發以下錯誤:
無法將類型
'System.Func<string,bool>'
隱式轉換為'System.Func<object,bool>'
但是,我們顯然可以做object x = "123"
想象一下,如果你這樣做了:
Func<string, bool> fStr = str => str.Length > 10;
Func<object, bool> fObj = fStr;
好吧,根據fObj
的簽名,你應該能夠用這樣的任何參數調用它:
fObj(7);
這顯然對fStr
無效。
委托類型Func<in T, out TResult>
在其第一個類型參數T
明顯是逆變的 。 可以接受任何對象的“func”也可以接受一個字符串,因此Func<object, X>
“是一個” Func<string, X>
,所以這in
類型T
是逆轉的。
你正試圖走另一條路。 只有當您碰巧知道運行時類型實際上是Func<object, bool>
才會有效,並且您需要使用顯式強制轉換語法來通知編譯器您的知識。 如果運行時類型不正確,則顯式強制轉換將失敗。
有效示例:
Func<object, bool> f1 = XXX;
Func<string, bool> f2 = f1; // OK, implicit
Func<object, bool> f3 = (Func<object, bool>)f2; // OK, explicit
來自MSDN
隱式轉換 :不需要特殊語法,因為轉換是類型安全的,不會丟失任何數據。 示例包括從較小到較大整數類型的轉換,以及從派生類到基類的轉換。
顯式轉換 (強制轉換):顯式轉換需要強制轉換運算符。 如果信息可能在轉換中丟失,或者由於其他原因導致轉換失敗,則需要進行轉換。 典型示例包括將數字轉換為精度較低或范圍較小的類型,以及將基類實例轉換為派生類。
你不能這樣做,因為你會丟失信息。 如果你以另一種方式嘗試,你可以做到
Func<object, bool> f = ....;
Func<string, bool> F = f;
因為你不會丟失信息。
一個簡單的例子是:
// This is ok. you can fit int in double
int some_int = 42;
double some_double = some_int;
// This is not ok. you might lose information
double some_double_2 = 42;
int some_int_2 = some_double_2;
// But you could do this, where the casts says: "Yep, I'm aware I might lose some
// information, but I'm an UBER programmer and want to do it anyways"
int some_int_3 = (int)some_double_2;
您可以投射或編寫自己的默認轉換。 看看上面的MSDN鏈接:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.