【发布时间】:2014-08-03 00:30:36
【问题描述】:
前言:
我在问题 C#'s equivalent of Java's <? extends Base> in generics 中阅读了有关协变和逆变的内容,但将我的项目切换到 .net 4.0 似乎没有奏效。
考虑以下类构造函数:
public Matrix(IList<RowVector> rows) {
if (!Vector.AreDimensionsEqual(rows)) {
throw new ArgumentException("foo");
}
for (int i = 0; i < rows.Length; ++i) {
for (int j = 0; j < rows[0].Length; ++j) {
Components[i][j] = rows[i].Components[j];
}
}
}
和方法AreDimensionsEqual(IList<Vector> vectors):
public static bool AreDimensionsEqual(IList<Vector> vectors) {
int dimensions = vectors[0].Dimension;
for (int i = 1; i < vectors.Count; ++i) {
if (vectors[i].Dimension != dimensions) {
return false;
}
}
return true;
}
这里,Matrix 构造函数中的rows 是RowVector 对象的列表,我试图将其用作需要Vector 对象列表的方法调用的参数。 RowVector 是 Vector 的子类型。
我最熟悉Java,所以如果我在那里编程,我会将AreDimensionsEqual 的方法签名定义为AreDimensionsEqual(IList<? extends Vector> vectors),但这种语法在C# 中不可用。
我还有什么遗漏的吗?
【问题讨论】:
-
你不能。您必须将其转换为其他类型的列表。
-
如何使用
IEnumerable<Vector>作为AreDimensionsEqual 方法的参数(然后在其主体中使用foreach 循环或Linq 表达式...)? -
我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
-
Java 和 C# 的差异以不同的方式完成。 Java 有使用点差异,而 C# 有声明点差异。两者不等价。 Use-site variance is strictly more powerful than declaration-site variance, 所以会有一些模式可以在 Java 中使用,但在 C# 中没有等效形式。
标签: c# generics inheritance interface