使用IEnumerable重载params函数

Jak*_*ake 4 c# generics params

假设我有两个功能:

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

Foo<T>(IEnumerable<T> items) where T : INotifyPropertyChanged
{
   Foo(items.ToArray());
}
Run Code Online (Sandbox Code Playgroud)

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

  1. 是否有可能在出现歧义时指定我想要调用哪个重载?
  2. 是否存在另一种params从泛型类调用函数的方法,假设泛型类型的约束使其成为该params类型的可行选项?

提前致谢!

SLa*_*aks 7

你需要传递一个INotifyPropertyChanged[],而不是一个T[].
例如:

Foo<T>(IEnumerable<T> items) where T : INotifyPropertyChanged
{
   Foo(items.Cast<INotifyPropertyChanged>().ToArray());
}
Run Code Online (Sandbox Code Playgroud)

但是,一般情况下,最好IEnumerableparams版本中调用版本,如下所示:

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

Foo<T>(IEnumerable<T> items) where T : INotifyPropertyChanged
{
   //do stuff
}
Run Code Online (Sandbox Code Playgroud)

  • 继续这个答案,因为后一个选项消除了任何可能的歧义 - 第一个是更多的编译器技巧. (2认同)