4

2つの関数があるとします。

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

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

Foo2つ目は、制約付きのジェネリッククラスから呼び出すことができますwhere T : INotifyPropertyChangedが、2つ目はそれ自体に解決されるため、スタックオーバーフロー例外が発生します。

  1. あいまいな場合に呼び出すオーバーロードを指定することはできますか?
  2. paramsジェネリック型の制約によってその型の実行可能なオプションになると仮定して、ジェネリッククラスから関数を呼び出す別の方法はありますparamsか?

前もって感謝します!

4

2 に答える 2

7

を渡す必要があります。を渡す必要はあり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
}
于 2010-06-18T20:29:23.897 に答える
3

入力をキャストしてみてください。

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

これがうまくいかない場合は、私にはわかりません。おそらく運が悪いでしょう。

于 2010-06-18T20:29:00.587 に答える