使用IEnumerable重载params函数

时间:2010-06-18 20:25:11

标签: c# generics params

假设我有两个功能:

Foo(params INotifyPropertyChanged[] items)
{
   //do stuff
}

Foo<T>(IEnumerable<T> items) where T : INotifyPropertyChanged
{
   Foo(items.ToArray());
}

第二个允许我从具有约束Foo的泛型类中调用where T : INotifyPropertyChanged,但第二个解析为自身,因此我得到堆栈溢出异常。

  1. 当存在歧义时,是否可以指定我想要调用哪个重载?
  2. 是否存在另一种从泛型类调用params函数的方法,假设泛型类型的约束使其成为params类型的可行选项?
  3. 提前致谢!

2 个答案:

答案 0 :(得分:7)

您需要传递INotifyPropertyChanged[],而不是T[] 例如:

Foo<T>(IEnumerable<T> items) where T : INotifyPropertyChanged
{
   Foo(items.Cast<INotifyPropertyChanged>().ToArray());
}

但是,一般情况下,最好从IEnumerable版本调用params版本,如下所示:

Foo(params INotifyPropertyChanged[] items)
{
   Foo((IEnumerable<INotifyPropertyChanged>) items);
}

Foo<T>(IEnumerable<T> items) where T : INotifyPropertyChanged
{
   //do stuff
}

答案 1 :(得分:3)

您可以尝试投射输入。

Foo<T>(IEnumerable<T> items) where T : INotifyPropertyChanged
{
   Foo(items.Cast<INotifyPropertyChanged>().ToArray());
}

如果这不起作用,我不知道,你可能运气不好。