回答
的前提是錯誤的;它工作正常:
Func<int> func = delegate { Console.WriteLine("first part"); return 5; };
func += delegate { Console.WriteLine("second part"); return 7; };
int result = func();
這是一個非空結果的多播委託,做工精細。您可以從控制檯看到兩個部分都已執行。 last item的結果是返回的結果。我們可以證明,這是一個真正的多播委託:
if(func is MulticastDelegate) Console.WriteLine("I'm multicast");
,它會寫「我播」 甚至只是第一線後(當只有上市一個方法)。
如果您需要在單獨的結果更多的控制權,然後使用GetInvocationList()
:
foreach (Func<int> part in func.GetInvocationList())
{
int result = part();
}
它可以讓你看到每個人的結果。
在IL術語:
.class public auto ansi sealed Func<+ TResult>
extends System.MulticastDelegate`
這就是說:從MulticastDelegate
Func<T>
繼承。基本上,所有意圖和目的,所有代表在.NET中的多路廣播委託。您可能能夠獲得託管C++非多播委託,我不知道。但肯定不是來自C#。
以下答案實際上是錯誤的,因爲您目前*可以*擁有帶非無效返回類型的多播委託(關於這是否始終如此,陪審團仍然沒有決定)。然而,它確實回答了「爲什麼一種語言不允許這樣的代表?」這個問題,所以我爲了完整性而離開它。
現在去,並給予好評馬克。
由於多種方法將返回多個值,所以什麼都要委託的一個返回值是呢?很明顯,在任何情況下都沒有令人滿意的答案。你可以說,多播委託應該:
- 回報在調用順序的第一種方法的價值(但IIRC調用順序是不確定的,所以如何將這項工作?)的最後一個方法
- 的價值迴歸,如上所述
- 返回由所有代表返回的單個不同值;拋出一個異常,如果不是所有的人都同意
需要注意的是* .NET中的所有*代表都是多投代表。 –
@DanielHilgarth:你指的是類名和它支持的功能嗎?如果是這樣,那麼在技術上你是正確的,但「所有代表都是多播的」會留下錯誤的印象。顯然你*可以*擁有非空的返回類型的委託,這需要和你的陳述一致。 – Jon
查看回答Marc。這正是我的意思。 –
組播的問題是,它覆蓋所有值只是打印的最後一個方法值,如果它有返回類型,所以你必須通過一個捕捉到一個的返回類型,讓我們看看下面的代碼
class Program
{
// i am going to add and subtract two num but i wanna get result in string the same thing you can do for int and what ever you want
delegate string mydeledagte(int a,int b);
delegate string d(int s, int t);
static void Main(string[] args)
{
mydeledagte ab = new mydeledagte(ad);
mydeledagte d= new mydeledagte(sub);
mydeledagte multi = ab + d;
foreach (mydeledagte individualMI in multi.GetInvocationList())
{
string retVal = individualMI(3, 5);
Console.WriteLine("Output: " + retVal);
Console.WriteLine("\n***developer of KUST***");
Console.ReadKey();
}
}
static string ad(int a, int b)
{
return (a + b).ToString();
}
static string sub(int a, int b)
{
return (a - b).ToString(); ;
}
}
- 1. 委託消息是否有必要始終具有void作爲返回類型?
- 2. 匿名委託可以返回值爲非void類型嗎?
- 3. 怎麼找出委託返回void?
- 4. 委託的返回類型
- 5. 返回類型爲void的方法返回的是什麼?
- 6. 爲什麼我必須導入我的委託頭文件?
- 7. 爲什麼委託必須是靜態的?
- 8. 爲什麼部分方法只能有void返回類型?
- 9. 方法必須具有返回類型WCF服務
- 10. C# - 方法必須具有返回類型
- 11. 問題與委託返回類型
- 12. 爲什麼WinRT類型必須密封?
- 13. 不返回值,從函數具有非void返回類型
- 14. 爲什麼返回類型void在.NET中聲明爲struct?
- 15. C#/委託不具有類型參數
- 16. 爲什麼不能使用具有多態返回類型的基本類型?
- 17. 重載方法必須具有相同的返回類型(或子類型)嗎?
- 18. 表達式必須具有類類型?
- 19. 爲什麼委託類型是從MulticastDelegate類派生的,爲什麼不直接從委託類派生?
- 20. 爲什麼必須有一個委託來橋接線程及其方法?
- 21. 爲什麼實體類必須有@Id?
- 22. 多播委託Ambigous
- 23. 委託人返回爲UsernamePasswordAuthenticationToken
- 24. 爲什麼固定寬度類型會委託回原始類型?
- 25. 爲什麼Window.open()的返回類型是void?
- 26. Java - 爲什麼Eclipse告訴我我的方法必須返回int類型?
- 27. 爲什麼C++中的Lambda函數0x返回類型必須是auto?
- 28. 爲什麼我收到錯誤「此方法必須返回類型...的結果?」?
- 29. 具有多種返回類型的類?
- 30. 爲什麼委託人在作爲財產使用時必須公開?
你能舉一個例子來說明它拋出異常嗎? –