2015-08-15 57 views
4

我有下面的代码多播委托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。请让我知道我在做什么错了?

+1

你应该实际描述你想要发生的事情,因为这是真正的问题。不是为什么代表按照他们的方式工作。 –

+0

什么是“总和”等? –

+0

你说“...它只显示...”,但你的代码不输出任何东西。 StringOperations的实现是什么,因为String没有'-'运算符。 –

回答

2

当您有一个具有多个处理程序的委托时,您仍然只能得到一个返回值。没有直接的方法来获得其他值,并且自然不能以一种将返回值发送给另一个的方式来链接处理函数。你将得到的唯一的东西是返回最后附加的处理程序的返回值。

这里的确没有模棱两可的行为,它只是它的工作方式。如果你想链接的功能,你必须使用不同的方法,然后委托。在这个例子中,你可以调用函数,就是这样。

+0

好吧,我将返回类型更改为'void',并在方法中执行所有计算并使用方法显示结果。 – Junaid

+0

@Junaid正常的方法只是调用方法而不使用委托。然后,无论你想要什么,你都可以锁定它代表们有自己的位置,但这不是其中之一。 –

+0

您能否让我知道何时使用委托,何时不使用?有什么有用的链接,你可以分享?谢谢 – Junaid

0

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

delegate string StringOperations(string str); 

delegate void StringOperations(string str); 

PS:也改变其他委托方法的返回类型为void