从 java 到 c# 的转换 - 协方差和逆变


  public interface IStorage<T> extends Iterable<T> {
        public void copyTo( IStorage<? super T> dest);
        public void copyFrom( IStorage<? extends T> src);
    }

上面是我必须放入 c# 中的 java 代码,目前看起来像

 interface IStorage<T>:  IEnumerable<T>
    {
     void copyTo( IStorage<? super T> dest);
     void copyFrom( IStorage<? extends T> src);}

但是我很难找到与函数参数中出现的等效项,我找到了 in/out 或 where 方法,但我仍然不清楚。

C# 中的泛型方差与 .NET 中的泛型方差非常不同。

你想要这样的东西:

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 类型的值,此时IStorage无论如何都不能再在T中协变。

鉴于你无法达到完全相同的效果,我建议你考虑一下你真正想要实现的目标,并考虑如下:

public interface IStorage<out T> : IEnumerable<T>
{
    void AddAll(IStorage<T> source);
}

甚至只是:

public interface IStorage<out T> : IEnumerable<T>
{
    void AddAll(IEnumerable<T> source);
}

因此,您将调用的目标从源反转到目标,此时目标可以从源中提取值,这更符合IEnumerable<T>作为值源。

最新更新