2016-06-28 12 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

Eric Lippertはこの問題を正確にカバーしています[彼のブログ](https://ericlippert.com/2015/10/14/casts-and-type-parameters-do -not-mix /) –

答えて

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 
{ 
    ... 
} 
関連する問題