【发布时间】:2017-06-07 11:18:45
【问题描述】:
我有一个如下所示的结构:
public struct Vector2d<T> where T : Unit {
public double x;
public double y;
...
public static Vector2d<Length> operator * (Vector2d<Speed> speed, Vector2d<Duration> duration) {
return new Vector2d<Length>(speed.x * duration.x, speed.y * duration.y);
}
}
长度、速度和持续时间类型都是单位的子类型。 (T 也继承自 Unit)
但是,编译器说:
二元运算符的参数之一必须是包含类型。
这让我觉得很奇怪,因为提供的类型是包含类型的子类。
为什么我试图做的事情是非法的?
我知道 Vector2 不是 Vector2 的子类,但我并没有尝试使用泛型类型的值。算子中用到的所有数据都是Vector2类。
【问题讨论】:
-
这是非法的,因为语言设计者将其设为非法。错误消息准确地告诉您 C# 规范描述的约束。编译器只是遵循规范。如果你想知道“为什么?”您需要询问语言设计者,即便如此,他们的推理也可能主要基于他们自己的意见。
-
不知道为什么这个问题被否决了......完全有效的问题与代码和明确的问题。来自我的 +1。
-
我建议不要尝试通过泛型来表示单元分析。单元是真正需要内置到语言中的东西。例如,参见 F# 的单元类型注释。 docs.microsoft.com/en-us/dotnet/articles/fsharp/…
标签: c# generics operator-overloading operators