首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.NET协方差

.NET协方差
EN

Stack Overflow用户
提问于 2012-06-20 20:25:49
回答 3查看 390关注 0票数 9

我有这个简单的代码:

代码语言:javascript
复制
public interface IReader<out T>
{
    IEnumerable<T> GetData();
}

这个接口在T上应该是协变的,我这样使用它:

代码语言:javascript
复制
private static Func<bool> MakeSynchroFunc<T>(IReader<T> reader) where T : IComposite
{
    return () => Synchronize(reader);
}

注意T实现IComposite的约束。同步方法在输入中接受一个IReader<IComposite>

代码语言:javascript
复制
private static bool Synchronize(IReader<IComposite> reader)
{
    // ......
}

编译器告诉我,尽管对T和IReader的协方差有限制,但它不能从IReader<T>转换为IReader<IComposite>

我是不是做错了什么?编译器应该能够验证约束,协方差应该允许我将IReader<T>用作IReader<Icomposite>,不是吗?

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-20 21:15:54

您应该能够通过向T添加class约束来解决您的问题。当涉及到结构时,协方差不起作用(IEnumerable<int>不能转换为IEnumerable<object>)。因为您没有将T约束为一个类,所以您可以传入一个IReader<some struct that implements IComposite>,它将是不可转换的。

票数 5
EN

Stack Overflow用户

发布于 2012-06-20 20:28:47

不幸的是没有。泛型不是协变的。IReader<T>IReader<IComposite>是完全不相关的类型,尽管TIComposite相关。

编辑:我不知道为什么这不适用于.Net 4和<out T>。还有没有人能回答?

票数 1
EN

Stack Overflow用户

发布于 2012-06-20 20:30:08

为什么不更改函数定义,因为这才是您真正想要的:

代码语言:javascript
复制
private static Func<bool> MakeSynchroFunc<T>(IReader<IComposite> reader) where T : IComposite

您可能需要泛型参数T来做其他事情,所以我把它留在那里。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11119520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档