从 java 到 c# 的转换 - 协变和逆变
Conversion from java to c# -Covariance and Contravariance
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 或接近的地方,但我仍然不清楚。
C# 中的泛型变化与 .NET 中的泛型变化非常不同。
您 sort 想要这样的东西:
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>
是价值的源泉。
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 或接近的地方,但我仍然不清楚。
C# 中的泛型变化与 .NET 中的泛型变化非常不同。
您 sort 想要这样的东西:
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>
是价值的源泉。