Предположим, что я имел в C#:неоднозначности между перегруженными методами, передаваемых в качестве делегатов в перегруженной вызов
class OverloadTest
{
void Main()
{
CallWithDelegate(SomeOverloadedMethod);
}
delegate void SomeDelegateWithoutParameters();
delegate void SomeDelegateWithParameter(int n);
void CallWithDelegate(SomeDelegateWithoutParameters del) { }
void CallWithDelegate(SomeDelegateWithParameter del) { }
void SomeOverloadedMethod() { }
void SomeOverloadedMethod(int n) { }
}
Конечно, это не компилируется, так как линия CallWithDelegate(SomeOverloadedMethod);
неоднозначно.
Теперь предположим, что существует только одна функция (без перегрузок). В этом случае не было бы никакой двусмысленности, потому что из того, что, похоже, происходит, компилятор может посмотреть тип параметра и отбросить SomeOverloadedMethod(int n)
из списка кандидатов (поскольку он может принимать только SomeDelegateWithoutParameters
), и поэтому он компилируется.
Я не собираюсь писать такой код; это просто из любопытства, от точки зрения автора компилятора. Я не мог найти ответа об этом, так как это довольно сложно ввести в слова.
Я хотел бы знать, есть ли какой-либо способ на C#, чтобы устранить этот вызов в Main()
в приведенном примере, чтобы он скомпилировал. Как вы можете указать его так, чтобы он перешел в CallWithDelegate(SomeDelegateWithoutParameters del)
, пройденный SomeOverloadedMethod()
, или CallWithDelegate(SomeDelegateWithParameter del)
пройденный SomeOverloadedMethod(int n)
?
Не все, что возможно в теории, возможны в реальном C# компилятор. Это пример. Вы можете вывести, что * конечно * беззаметный был предназначен. Но компилятор не был написан для этого, возможно, для производительности или, возможно, нехватки времени/ROI, или, возможно, только никто не думал об этом. Вся вещь «делегировать» действительно очень C# -специфична и, в любом случае, рудиментарна; Я должен был бы предположить, что они будут выполнять функции refs по-разному, если бы им это нужно было сделать снова. Лучшая дорога, чтобы действительно понять это, - это прочитать спецификацию C#. –
@ DaxFohl * «Конечно, беззатратный был предназначен» * => как вы можете это сказать? Вы не можете. Оба варианта одинаковы, поскольку параметр предоставляется 'CallWithDelegate'. Делегаты не являются рудиментарными, они эквивалентны типам указателей на функции, и я сомневаюсь, что они поступили бы иначе, если бы они перепроектировали язык сегодня. У вас точно такая же проблема на C++] (http://stackoverflow.com/a/2942442/3764814). –