Будет ли делегирование с ключевым словом params совпадать с любым методом?
Нет. Они по-прежнему должны учитывать дисперсию типов.
params - это только синтетический сахар, говорящий о том, что с этого момента и далее все параметры сайта вызова считаются частью одного и того же массива в методе.
Итак, для метода, определенного как:
TimeSpan BenchmarkMethod(SomeMethod someMethod, params Company[] parameters)
Вы можете сделать:
Company company1 = null;
Company company2 = null;
//In BenchmarkMethod, company1 and company2 are considered to be part of
//parameter 'parameters', an array of Company;
BenchmarkMethod(dlg, company1, company2);
, но не:
Company company1 = null;
object company3 = new Company();
BenchmarkMethod(dlg, company1, company3);
Поскольку хотя company3 содержит Company во время выполнения, ее статическим типом является object.
Итак, теперь мы знаем, что params просто определяет массив метода, который позволяет вам использовать более удобный синтаксис на сайте вызова.
Теперь давайте рассмотрим реальную причину того, что ваш код работает не так, как вы ожидали: Дисперсия типа
Ваш делегат определен как:
public delegate void SomeMethod(params object[] parameters);
и вы выбираете метод как:
public abstract void InsertObjects (Company c);
При вызове делегата:
SomeMethod dlg = new SomeMethod(InsertObjects);
TimeSpan executionTime = BenchmarkMethod(dlg, c);
Вы, по сути, говорите, что можете вызывать InsertObjects, передавая ему массив с любым типом объекта вместо объекта типа Company.
Это, конечно, не разрешено компилятором.
Если вместо этого вы инвертируете типы делегата и целевой метод, например:
public delegate void SomeMethod(params Company[] parameters);
public TimeSpan BenchmarkMethod(SomeMethod someMethod, params Company[] parameters) {
DateTime benchmarkStart = DateTime.Now;
someMethod(parameters);
DateTime benchmarkFinish = DateTime.Now;
return benchmarkFinish - benchmarkStart;
}
public void InsertObjects(object c) {
Console.WriteLine(c);
}
Затем он скомпилируется, потому что вы передадите массив Customer методу, который принимает любой тип объекта.
Вывод:
params не влияет на правила дисперсии типов.