2016-06-28 61 views
0

以下不會編譯。感覺應該是這樣。我想知道是否有解決問題的方法。如果可能的話,我寧願避免要求任何課程下降。C#任意轉換

public static Func<DP, R> CastDomain<D, R, DP>(this Func<D, R> function) { 
    return (DP dp) => { 
    if (dp is D) { 
     D d = (D)dp; // Compile error: cannot convert DP to D. But that's crazy as we are inside if (dp is D) { 
     return function(d); 
    } else { 
     // handle the error . . . 
    } 
    }; 
} 
+0

您可以通過鑄造物體,例如, '(d)(對象)dp'。我敢肯定,必須有一個重複的解釋爲什麼... –

+0

埃裏克Lippert涵蓋了這個問題[在他的博客](https://ericlippert.com/2015/10/14/casts-and-type-parameters-do - 未混合/) –

回答

1

//但是,這太瘋狂了,因爲我們都在裏面,如果(dp爲d)

這並沒有什麼差別。 C#規範中沒有任何內容說明演員的有效性取決於您是否已經查看了某些內容。

基本上,你不能在這樣的泛型之間進行轉換 - 你必須通過object去。這很煩人,但這是事情的方式:

0

強制只能應用於具有繼承或轉換運算符的類。

如果你堅持鑄造,鑄造成一個共同的類型,例如。對象,第一。

D d = (D)(object)dp; 

如果d繼承了DP,您可以添加這樣的限制,以滿足編譯器。

public static Func<DP, R> CastDomain<D, R, DP>(this Func<D, R> function) where D : DP 
{ 
    ... 
}