-2

我有这个类名为Point2D具有两个属性XY. 此类具有到 ValueTuple 的隐式转换(double x, double y)

当我使用 using时,我的问题就List<Point2D>()来了,它给了我List<(double x, double y)>()Linq Ienumerable.Cast<T>()InvalidCastException

我究竟做错了什么?

编辑:

例子

public class Point2D
{
public Point2D(double x, double y)
{X=x;
Y=y;
}
 public double X {get;}
public double Y {get;}

public static implicit operator (double x, double y) (Point2D point)=> (point.X, point.Y);

public static implicit operator Point2D((double x, double y) point) => new Point2D( point.x, point.y);
}

上课了,所以如果我这样做

var points=new List<Point2D>(){(1,2),(2,3)};

如果我这样做,我会得到演员表异常

var list = points.Cast<(double x, double y)>().ToList();
4

1 回答 1

1

定义运算符时,是在定义自定义转换运算符,而不是强制转换运算符。自定义转换运算符仅在编译时从一种静态类型应用到另一种静态类型(这通常意味着它们不能在泛型方法中使用)。“Cast”可枚举方法仅应用强制转换操作(顾名思义)。

不可能创建自定义转换运算符(转换是只有语言/运行时才能解决的问题)。

如果您更改points.Cast<(double x, double y)>()points.Select>(p => ((double x, double y))p),那将改为调用您的自定义转换运算符(尽管所有这些括号看起来很疯狂,但需要转换为命名元组)。

于 2018-07-12T02:11:51.637 回答