嵌套泛型类型参数 - 如何处理?

Gac*_*cek 2 c# generics

我在参数声明中创建了一些使用嵌套类型参数泛型类型的方法:

public void Foo(IList<Pair<double, IList<double>>> myParameter)
{ // code goes here 
}
Run Code Online (Sandbox Code Playgroud)

我想要实现的是强制此方法接受4种类型的变量:

  • List<Pair<double, List<double>>> myVar
  • List<Pair<double, double[]>> myVar
  • Pair<double, List<double>>[] myVar
  • Pair<double, double[]>[] myVar

但似乎第二个嵌套接口无法通过C#即时转换.在尝试将上面列出的一些变量传递给我的方法时,我收到错误:

参数1:无法从System.Collections.Generic.List <...>转换为无法从System.Collections.Generic.IList转换<...>

我真的需要为此方法创建两个别名来处理此问题吗?或者也许我可以使用某种技巧来克服这个问题?

Dar*_*rio 5

您的代码会导致差异问题.

即使您最初通过了内部IList<double>也会允许您分配,这会破坏类型安全性.List<double>double[]

(出现这种情况的原因List<Orange>可能与以下情​​况不同List<Fruit>:您可以将苹果推入其中.)

为了实现正确的方差行为,您必须通过使用IEnumerable<T>s代替IList<T>s 来确保不变性(仅适用于.NET 4.0).

以前版本的C#根本无法处理差异!