Перегрузка функции params с помощью IEnumerable - PullRequest
4 голосов
/ 19 июня 2010

Предположим, у меня есть две функции:

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?

Заранее спасибо!

Ответы [ 2 ]

7 голосов
/ 19 июня 2010

Вам необходимо передать INotifyPropertyChanged[], а не T[].
Например:

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

В целом, однако, лучше вызывать версию IEnumerable из *Версия 1008 *, например:

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

Foo<T>(IEnumerable<T> items) where T : INotifyPropertyChanged
{
   //do stuff
}
3 голосов
/ 19 июня 2010

Вы можете попробовать привести данные.

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

Если это не сработает, у меня нет идеи, вам, вероятно, не повезло.

...