C# 用IEnumerable重载params函数

C# 用IEnumerable重载params函数,c#,generics,params,C#,Generics,Params,假设我有两个函数: Foo(params INotifyPropertyChanged[] items) { //do stuff } Foo<T>(IEnumerable<T> items) where T : INotifyPropertyChanged { Foo(items.ToArray()); } Foo(参数INotifyPropertyChanged[]项) { //做事 } Foo(IEnumerable items),其中T:INoti

假设我有两个函数:

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

Foo<T>(IEnumerable<T> items) where T : INotifyPropertyChanged
{
   Foo(items.ToArray());
}
Foo(参数INotifyPropertyChanged[]项)
{
//做事
}
Foo(IEnumerable items),其中T:INotifyPropertyChanged
{
Foo(items.ToArray());
}
第二个允许我从一个具有约束的泛型类调用
Foo
,其中T:INotifyPropertyChanged,但第二个解析为自身,因此我得到一个堆栈溢出异常

  • 是否可以指定在出现歧义时要调用哪个重载
  • 假设泛型类型的约束使其成为
    params
    类型的可行选项,是否有其他方法从泛型类调用
    params
    函数

  • 提前谢谢

    您可以尝试转换输入

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

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

    你需要通过一个
    INotifyPropertyChanged[]
    ,而不是
    t[]

    例如:

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

    您提供的代码选择Foo重载,这是堆栈溢出的保证。对不起,我错了。第一个函数似乎有Foo(params object[]items)签名。无法将类型“T[]”转换为“System.ComponentModel.INotifyPropertyChanged[]”并使用此答案,因为后一个选项消除了任何可能的歧义-第一个选项更像是编译器的诡计。
    Foo(params INotifyPropertyChanged[] items)
    {
       Foo((IEnumerable<INotifyPropertyChanged>) items);
    }
    
    Foo<T>(IEnumerable<T> items) where T : INotifyPropertyChanged
    {
       //do stuff
    }