TN.*_*TN. 1 generics constraints type-conversion type-constraints c#-3.0
我想在一个允许安全转换的泛型类上实现泛型方法,参见示例:
public class Foo<T> : IEnumerable<T>
{
...
public IEnumerable<R> SafeCast<R>()
where T : R
{
return this.Select(item => (R)item);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,编译器告诉我Foo<T>.SafeCast<R>() does not define parameter 'T'.我理解这个消息,我不能T在方法中指定约束,因为它没有在方法中定义.但是如何指定逆约束?
Eri*_*ert 17
C#没有那种约束.约束必须是"R必须可转换为 X"的形式; 我们不支持"R必须可以从 X 转换"形式的约束.
这是不幸的,因为它使涉及逆变转换的某些场景更容易.
顺便提一下,Scala允许这样的约束.
有趣的是,你可以使用扩展方法做你想做的事情,但是当你调用它时你必须是多余的:
public static IEnumerable<R> SafeCast<T, R>(this IEnumerable<T> x) where T : R
{
return x.Cast<R>();
}
Run Code Online (Sandbox Code Playgroud)
现在你可以说:
IEnumerable<Giraffe> giraffes = whatever;
IEnumerable<Animal> animals = giraffes.SafeCast<Giraffe, Animal>();
Run Code Online (Sandbox Code Playgroud)
在C#4中,您的代码基本上是不必要的; 如果T是参考类型,则IEnumerable<T>在C#4中的T中安全协变.
| 归档时间: |
|
| 查看次数: |
2375 次 |
| 最近记录: |