C# 多播代理歧义

C# 多播代理歧义,c#,multicastdelegate,C#,Multicastdelegate,我有下面的代码 StringOperations sumString, reverseString, lowerString, upperString, multicastString; sumString = new StringOperations(sum); reverseString = new StringOperations(reverse); lowerString = new StringOperations(lower); upperS

我有下面的代码

    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 string StringOperations(string str);

我正在使用多播委托并返回
string
,如上面的代码所示。请告诉我我做错了什么?

当您有一个连接了多个处理程序的委托时,您仍然只能得到一个返回值。没有直接的方法来获取其他值,当然也不能以一个函数的返回值发送给另一个函数的方式来链接处理程序函数。您将得到的唯一结果是返回最后一个附加处理程序的返回值


这里没有模棱两可的行为,只是它的工作方式。如果要链接函数,必须使用不同的方法,然后使用委托。在本例中,您只需调用函数即可。

在多播委托中,方法的返回类型应为
void
,因为它不会混合值。所以方法签名会改变


PS:同时将其他委托方法的返回类型更改为
void

,您应该实际描述您希望发生的事情,因为这才是真正的问题。这并不是为什么学员会这样工作。什么是
sum
,等等?您会说“…它只显示…”,但您的代码不会输出任何内容。
StringOperations
的实现是什么,因为字符串没有
-
运算符。@ThomasWeller小写,大写,sum和reverse是代码中未显示的delgated函数。我将返回类型更改为
void
,在方法中执行所有计算,并使用方法显示结果。@Junaid正常的方法是只调用方法,而不使用任何委托。然后你就可以随心所欲地把它们锁起来。代表有自己的位置,但这不是其中之一。您能告诉我何时使用代表和何时不使用代表吗?有什么有用的链接可以分享吗?Thanks@Junaid它们最常见的用途是事件,在事件中,任何兼容对象都可以订阅事件,并在发生事件时调用委托。在这种情况下通常没有返回值。在这段代码中,您知道要调用什么函数,按什么顺序调用,并且希望得到某种回报。因此,不需要使用委托,因为您可以按顺序调用函数,并使用返回值作为下一个函数的参数。如果该方法未知且可能更改,则可能存在使用返回值的单强制转换委托的情况。
delegate string StringOperations(string str);
delegate void StringOperations(string str);