C# 嵌套泛型类型参数-如何处理?
我创建了一些在参数声明中使用嵌套类型参数泛型类型的方法:C# 嵌套泛型类型参数-如何处理?,c#,generics,C#,Generics,我创建了一些在参数声明中使用嵌套类型参数泛型类型的方法: public void Foo(IList<Pair<double, IList<double>>> myParameter) { // code goes here } public void Foo(IList myParameter) {//代码在这里 } 我想要实现的是强制此方法接受4种类型的变量: 列出myVar 列出myVar Pair[]myVar Pair[]myVar 但第二
public void Foo(IList<Pair<double, IList<double>>> myParameter)
{ // code goes here
}
public void Foo(IList myParameter)
{//代码在这里
}
我想要实现的是强制此方法接受4种类型的变量:
列出myVar
列出myVar
Pair[]myVar
Pair[]myVar
我真的需要为这个方法创建两个别名来处理这个问题吗?或者我可以用某种技巧来克服这个问题 在不知道你在传递什么的情况下,这里的问题很可能是因为你没有 幸运的是,在C#4.0中,这是存在的,我愿意猜测您可以使用
IEnumerable
作为内部类型参数,并且它会工作(除非您需要改变列表,而不是仅仅迭代它)
如果无法使用C#4.0,则必须将
列表的类型参数更改为请求的特定类型。您的代码会导致差异问题
内部的IList
将允许您分配列表
,即使您最初传递了一个double[]
,这将破坏类型安全性
(发生这种情况的原因与列表
不能被视为列表
的原因相同:您可以将苹果推入其中。)
为了实现正确的差异行为,您必须通过使用IEnumerable
s而不是IList
s(仅适用于.NET 4.0)来确保不变性
以前版本的C#根本无法处理差异!您可以在C#2.0中使用通用约束+
void Foo(IList myParameter)
其中TList:IList
C#在这一点上的类型推断有问题,因此您需要在调用期间指定。您想要一个既能接受某物
又能接受列表
?这似乎有点奇怪-用例是什么?@AakashM:不,看看[]
。两者都实例化了IList
。谢谢。不幸的是,我不能使用C#4.0,所以我可能需要创建一些别名:/谢谢,这是某种解决方案,但最终它会带来更多麻烦,比它的价值更大。无论如何,感谢您尝试+1,但是这里不需要TList1
参数,这将简化s签名并允许在更多情况下成功进行类型推断。
void Foo<TList>(IList<Pair<double, TList>> myParameter)
where TList : IList<double>