Ответ 1
Представьте себе, что это было возможно. Предположим, что у меня может быть перегруженный делегат:
public delegate void OneDelegate(int i);
public delegate void OneDelegate(string s);
Теперь представьте, что я объявляю переменную этого типа, а затем назначаю ей функцию, например:
OneDelegate myDelegate = StringMethod;
где StringMethod
объявляется следующим образом:
public void StringMethod(string s) { Console.WriteLine(s); }
Теперь вы передаете myDelegate
в другой код, и этот код делает это:
myDelegate(47);
Что вы ожидаете в этом случае? Как вызов runtime вызывает StringMethod()
с целым аргументом?
Если вы действительно хотите, чтобы делегат мог взять любой набор параметров, единственная опция - иметь один с массивом params object[]
:
public delegate void OneDelegate(params object[] parameters);
Но тогда вам придется назначить ему функцию, которая может обрабатывать любой массив объектов, например:
public void MyMethod(params object[] parameters)
{
if (parameters == null || parameters.Length == 0)
throw new ArgumentException("No parameters specified.");
if (parameters.Length > 1)
throw new ArgumentException("Too many parameters specified.");
if (parameters[0] is int)
IntMethod((int) parameters[0]);
else if (parameters[0] is string)
StringMethod((string) parameters[0]);
else
throw new ArgumentException("Unsupported parameter type.");
}
Как вы можете видеть, это становится беспорядочным. Поэтому я утверждаю вам, что если вам нужен такой делегат, вы, вероятно, допустили ошибку в своем архитектурном дизайне. Определите этот недостаток и исправьте дизайн, прежде чем приступать к реализации, поскольку в противном случае пострадает ремонтопригодность вашего кода.