Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 嵌套泛型类型参数-如何处理?_C#_Generics - Fatal编程技术网

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#动态转换。尝试将上面列出的一些变量传递给我的方法时,我得到错误:

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


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

在不知道你在传递什么的情况下,这里的问题很可能是因为你没有

幸运的是,在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>