c#任意类型转换

本文关键字:类型转换 任意 | 更新日期: 2023-09-27 17:52:46

以下代码无法编译。感觉应该是这样。我想知道是否有办法解决这个问题。如果可能的话,我宁愿避免要求从类继承任何东西。

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

c#任意类型转换

//但这太疯狂了,因为我们在if (dp is D)

这没什么区别。c#规范中没有规定强制转换的有效性取决于你是否已经检查了某些内容。

基本上,你不能像那样在泛型类型之间转换——你必须通过object。这很烦人,但事情就是这样:

D d = (D) (object) dp;

强制类型转换只能应用于具有继承或转换操作符的类。

如果您坚持强制转换,请强制转换为公共类型,例如:对象,首先。

D d = (D)(object)dp;

如果D继承了DP,你可以添加这样的约束来满足编译器。

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