C#任意演员

时间:2016-06-28 08:48:54

标签: c# casting

以下不会编译。感觉应该是这样。我想知道是否有解决问题的方法。如果可能的话,我宁愿避免要求任何事情从课堂上下来。

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 . . .
    }
  };
}

2 个答案:

答案 0 :(得分:1)

  

//但是如果(dp是D)

,我们就在里面这很疯狂

这没有任何区别。 C#规范中没有任何内容表明演员表的有效性取决于你是否已经检查了一些内容。

基本上,你不能在这样的泛型类型之间进行转换 - 你必须通过object。这很烦人,但这就是事情的方式:

D d = (D) (object) dp;

答案 1 :(得分:0)

Cast只能应用于具有继承或转换运算符的类。

如果你坚持施法,则施放到普通类型,例如。对象,首先。

D d = (D)(object)dp;

如果D继承DP,则可以添加此类约束以满足编译器。

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