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,

Другие вопросы по тегам