簡體   English   中英

Func <>參數的差異

[英]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.

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