Multicast Delegate Ambigous
У меня есть код ниже
StringOperations sumString, reverseString, lowerString, upperString, multicastString;
sumString = new StringOperations(sum);
reverseString = new StringOperations(reverse);
lowerString = new StringOperations(lower);
upperString = new StringOperations(upper);
multicastString = upperString + lowerString + reverseString + sumString;
int count = 4;
if (!checkBox1.Checked)
{
multicastString -= upperString;
count--;
}
if (!checkBox2.Checked)
{
multicastString -= reverseString;
count--;
}
if (!checkBox3.Checked)
{
multicastString -= lowerString;
count--;
}
if (!checkBox4.Checked)
{
multicastString -= sumString;
count--;
}
if (count > 0)
{
string test = multicastString(textBox1.Text);
}
Когда флажки в верхнем и нижнем регистре установлены, то это показывает только результат функции в нижнем регистре.
Если я выберу флажки в верхнем, нижнем и обратном регистрах, то это покажет мне только результат обратной функции.
мой delegate
ниже
delegate string StringOperations(string str);
Я использую многоадресный делегат и возвращаюсь string
как показано в приведенном выше коде. Пожалуйста, дайте мне знать, что я делаю не так?
2 ответа
Если у вас есть делегат, к которому подключено несколько обработчиков, вы все равно получите только одно возвращаемое значение. Не существует прямого способа получить другие значения, и, естественно, вы не можете связать функции-обработчики так, чтобы возвращаемое значение одного передавалось другому. Единственное, что вы получите, - это возвращаемое значение последнего присоединенного обработчика.
Здесь действительно нет двусмысленного поведения, просто так оно и работает. Если вы хотите объединить функции в цепочку, используйте другой подход, чем делегат. В этом примере вы можете просто вызвать функции и все.
В многоадресном делегате методы должны иметь void
как тип возвращаемого значения, потому что он не будет смешивать значения. Так что сигнатура метода изменится
от
delegate string StringOperations(string str);
в
delegate void StringOperations(string str);
PS: также измените тип возврата других делегированных методов на void
,