Overloading a params function with an IEnumerable
Suppose I have two functions:
Foo(params INotifyPropertyChanged[] items)
{
//do stuff
}
Foo<T>(IEnumerable<T> items) where T : INotifyPropertyChanged
{
Foo(items.ToArray());
}
The second one allows me to call Foo
from a generic class with the constraint where T : INotifyPropertyCh开发者_开发知识库anged
, but the second resolves to itself so I get a stack overflow exception.
- Is it possible to specify which overload I want to call when there's some ambiguity?
- Is there another way to call a
params
function from a generic class, assuming the generic type's constraints make it a viable option for theparams
type?
Thanks in advance!
You need to pass a INotifyPropertyChanged[]
, not a T[]
.
For example:
Foo<T>(IEnumerable<T> items) where T : INotifyPropertyChanged
{
Foo(items.Cast<INotifyPropertyChanged>().ToArray());
}
In general, however, it's better to call the IEnumerable
version from the params
version, like this:
Foo(params INotifyPropertyChanged[] items)
{
Foo((IEnumerable<INotifyPropertyChanged>) items);
}
Foo<T>(IEnumerable<T> items) where T : INotifyPropertyChanged
{
//do stuff
}
You could try casting the input.
Foo<T>(IEnumerable<T> items) where T : INotifyPropertyChanged
{
Foo(items.Cast<INotifyPropertyChanged>().ToArray());
}
If this doesn't work, I don't have an idea, you are probably out of luck.
精彩评论