4 votes

Surcharge d'une fonction params avec un IEnumerable

Supposons que j'ai deux fonctions :

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

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

Le second me permet d'appeler Foo à partir d'une classe générique avec la contrainte where T : INotifyPropertyChanged mais la seconde se résout en elle-même et j'obtiens une exception de débordement de pile.

  1. Est-il possible de préciser quelle surcharge je veux appeler lorsqu'il y a une ambiguïté ?
  2. Existe-t-il un autre moyen d'appeler un params d'une classe générique, en supposant que les contraintes du type générique en fassent une option viable pour la fonction params type ?

Merci d'avance !

7voto

SLaks Points 391154

Vous devez passer un INotifyPropertyChanged[] et non un T[] .
Par exemple :

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

En général, cependant, il est préférable d'appeler la fonction IEnumerable de la version params version, comme ceci :

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

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

3voto

Femaref Points 41959

Vous pourriez essayer de couler l'entrée.

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

Si cela ne fonctionne pas, je n'ai pas d'idée, vous n'avez probablement pas de chance.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X