為什麼C 的Lambda式不能直接轉換成Delegate?

時間 2021-06-03 22:43:48

1樓:guohc

你呼叫的BeginInvoke方法的簽名是:

public

DispatcherOperation

BeginInvoke

(Delegate

method

,params

object

args

);第乙個引數接受的是Delegate物件,Delegate型別的宣告為:

public

abstract

class

Delegate

:ICloneable

,ISerializable

你會發現這個類是abstract的,也就是說lambda表示式無法轉化成Delegate物件(因為Delegate無法被例項化),這裡必須傳入Delegate的非abstract子類。但是Delegate的子類有很多,究竟選擇哪個子類物件編譯器無法推斷出,所以這裡你必須指定子類型別,比如你給出的Action。

Dispatcher還有乙個方法是:

public

void

Invoke

(Action

callback

);呼叫這個方法時就可以:

this.Dispatcher.Invoke(() => );

因為Action是可以被例項化,這裡編譯器就會幫你new乙個指向lambda表示式的Action物件。

2樓:基德劉

委託實際上是_target,_methodPtr,和_invocationList三部分構成的類,名稱由你定義。而lambda表示式透過匿名方法可以滿足前兩個,但是怎麼也做不到第三個吧:委託可以透過Delegate.

Combine與Delegate.Remove合併或取消合併多個委託,乙個匿名方法只是乙個方法而已。.NET有了范型之後,基本上自己不用寫委託,有17個無返回Action和17個有返回Func。

而C#又進一步提供了語法糖,所以才會造成這樣的認知混淆吧……建議樓主先搞懂是什麼的問題,再善用語法糖這樣方便書寫的東西

3樓:陸萌萌

我猜是這個原因,lambda表示式本身就是乙個匿名方法,把它給Action、Func、Predicate都是可以的,不信您可以試一下直接把lambda表示式給上述委託賦值,同樣意義下是沒有任何問題的。

而您的問題這裡,BeginInvoke方法的引數是乙個Delegate,而這裡沒有指定確定的委託型別的話(即乙個已經定義好的存在的委託)就會出現編譯器不知道應該把您的lambda表示式型別推導成什麼,自然會無法通過編譯。

您可以把lambda表示式和委託認為是不同的型別,只是編譯器有語法糖給您自動推導型別,就好比自動裝箱拆箱一樣,這裡因為您沒有指定具體推導的委託型別,而lambda不等價於Delegate,所以出現了這種問題。

4樓:

delegate的本質是一種特殊的型別。在C++應該叫函式指標。其實就是乙個方法的引用,有了這個引用,在C#中你就可以把方法例項當做方法的實參到處傳遞,就達到了「委託」的用意。

那個new Action確實可以省略掉,且效果完全一樣,但那只是個語法糖而已,跟型別推導差不多。也就是說根據這個Action型別的例項是可以推導出Action具體簽名的,所以可以省略new Action。

c 為什麼存在顯式例項化 顯式具體化兩種顯式宣告模板方法?

noname 設A explicit instantiation這是說,我已經有個模具了,你可以往裡面灌料了,任何料,塑料,鐵水,等等,灌完了,就是explicit instantiation。B explicit specialization這是說,我發現A模具似乎在灌 塑料 這方面還不夠專業,我...

在 C 大調中,為什麼開放式的 F G Em Am 和弦的根音要比 C 和弦的根音低?

因為,吉他的空弦音,就這樣規定的,E 是最低的音,根音一般都落在這個區間,所以,聽起來 C 和弦的根音,會比 F,G,Em 等要高。貝斯也是同理,它的空弦音,正好是,把結他較低的4根弦,分別低八度。至於,I 級是不是最低的音,這顯然不是。在乙個音階裡面,I 級被排列在最低的位置 但是,實際演奏中,音...

求學霸詳解,為什麼不能選C

風與樹的歌 tea和back tea說的是同乙個型別,如果選c那就是翻譯成他們喜歡喝茶但他們更喜歡喝黑茶,這讀著有點奇怪吧。選D就是說他們喜歡喝茶尤其偏愛喝黑茶。 為往聖繼絕學 我想這裡選C並沒有問題,but用語感判斷有一種遞進的感覺,好像前面的內容只是鋪墊而but之後才加上自己的主要觀點,並且這種...