假设您有一个通用类
这种方法的问题在于,
Foo
:public class Foo<T> {
public T Data {
get;
protected set;
}
}
是否有可能定义一个仅适用于T
继承(或是)特定类型的构造函数。
例如,假设T
是一个int
:
public Foo () {
this.Data = 42;
}
类型约束应该在编译时检查。这对于优化可能很有用。例如,如果您有一个 IEnumerable<T>
并且希望创建一个“缓存”(因为 LINQ 查询可能非常昂贵),那么现在如果 IEnumerable<T>
已经是一个 IList<T>
,不复制数据是有用的。另一方面,如果它真的是一个 LINQ 查询,另一个构造函数可以将数据存储在数组中。
作为解决方法,当然可以继承 Foo
(例如 IntFoo
)并在那里定义一个构造函数:
public class IntFoo : Foo<int> {
public IntFoo () {
this.Data = 42;
}
}
这种方法的问题在于,
private
数据不可访问(或者必须将其设置为 protected
)。还有其他缺点吗?或者说这样建模类型特定的构造函数是正确的方式吗?
where ...
子句,在这种情况下,只有当类型匹配时才能访问构造函数。 - Willem Van OnsemIEnumerable<T>
是否为IList<T>
。毕竟,您总是可以在运行时将IList<T>
分配给IEnumerable<T>
。 - HugoRuneIEnumerable<T>
实际上是IList<T>
,是否可能在编译时完成”的单独问题。 - Alexei Levenkov