【发布时间】:2016-05-11 15:19:09
【问题描述】:
这样的界面蓝图:
public interface IOption<out T>{
IOption<R> Map<R> (Func<T, R> func);
IOption<R> FlatMap<R> (Func<T, IOption<R>> func);
T Get ();
bool IsEmpty ();
Y GetOrElse (Func<Y> defaultValue) where Y: T;//error
}
重要的是它应该支持变体。我坚持Y GetOrElse (Func<Y> defaultValue) where Y: T;。
错误显示The covariant type parameter T must be contravariantly valid on IOption<T>.GetOrElse(Func<T>)。
此外,Func 应该定义为 public delegate R Func<in A, out R>(A a); .NET2.0 而不是将 varient 附加到 Func 泛型类型。
感谢任何建议。
更新
来自Scala 语言的选项设计。我知道Y 应该是T 的超类型,但它似乎无法简单地定义where T: Y,我该怎么办?
我还有一个问题——为什么不能直接定义T GetOrElse<T> (T defaultValue);???
【问题讨论】:
-
你的接口在结果类型中已经是协变的,所以你可以定义
T GetOrElse(Func<T> defaultValue)。 -
@Lee,编译器会打印一个错误,因为
Func的 T 不能作为协变量。它定义为delegate T Func<out T>()