代码之家  ›  专栏  ›  技术社区  ›  Jake

用IEnumerable重载params函数

  •  4
  • Jake  · 技术社区  · 14 年前

    Foo(params INotifyPropertyChanged[] items)
    {
       //do stuff
    }
    
    Foo<T>(IEnumerable<T> items) where T : INotifyPropertyChanged
    {
       Foo(items.ToArray());
    }
    

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

    1. 有没有可能指定在出现歧义时要调用哪个重载?
    2. 有没有别的办法叫警察 params 参数 类型?

    2 回复  |  直到 12 年前
        1
  •  7
  •   SLaks    14 年前

    你需要通过考试 INotifyPropertyChanged[] ,不是 T[] .
    例如:

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

    IEnumerable 来自 params

    Foo(params INotifyPropertyChanged[] items)
    {
       Foo((IEnumerable<INotifyPropertyChanged>) items);
    }
    
    Foo<T>(IEnumerable<T> items) where T : INotifyPropertyChanged
    {
       //do stuff
    }
    
        2
  •  3
  •   Femaref    14 年前

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

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