首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从java到c# -Covariance的转换和反方差

从java到c# -Covariance的转换和反方差
EN

Stack Overflow用户
提问于 2015-04-04 13:14:28
回答 1查看 234关注 0票数 1
代码语言:javascript
运行
复制
  public interface IStorage<T> extends Iterable<T> {
        public void copyTo( IStorage<? super T> dest);
        public void copyFrom( IStorage<? extends T> src);
    }

上面是我必须在c#中放进的java代码,现在它看起来像

代码语言:javascript
运行
复制
 interface IStorage<T>:  IEnumerable<T>
    {
     void copyTo( IStorage<? super T> dest);
     void copyFrom( IStorage<? extends T> src);}

但是,当它出现在函数的参数中时,我很难找到它的等价物,我找到了输入/输出,或者在哪里接近,但我仍然不清楚。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-04 13:21:00

C#中的泛型方差与.NET中的泛型差异很大。

你想要这样的东西:

代码语言:javascript
运行
复制
public interface IStorage<out T> : IEnumerable<T>
{
    // This won't compile - the constraint is on the wrong argument
    void CopyTo<TDest>(IStorage<TDest> dest) where T : TDest
}

但正如所述,这是无效的。

正如所写的那样,这个方法对我来说没有什么意义--您需要接口中的其他东西来接受T类型的值,此时IStorageT中就不再是协变的了。

考虑到你不能达到完全相同的效果,我建议你考虑一下你真正想要达到的目标,并考虑这样的事情:

代码语言:javascript
运行
复制
public interface IStorage<out T> : IEnumerable<T>
{
    void AddAll(IStorage<T> source);
}

甚至只是:

代码语言:javascript
运行
复制
public interface IStorage<out T> : IEnumerable<T>
{
    void AddAll(IEnumerable<T> source);
}

因此,您可以将调用的目标从源反向到目的地,此时目标可以从源中提取值,这与IEnumerable<T>作为值的来源更加一致。

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

https://stackoverflow.com/questions/29446845

复制
相关文章

相似问题

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