2016-01-24 53 views
4

我以前用過short.Parse(somestring)。但最近我見過的short.Parse()象下面這樣一個混亂的用法:是short.Parse屬性還是方法?

var shortArray = Array.ConvertAll(stringArr, short.Parse); 

所以,Array.ConvertAll預計陣列和轉換器。好吧,好! 但我們如何通過short.Parse作爲(或類似)的財產?我在Int16結構中找不到這樣的屬性。那麼,這裏發生了什麼?

+0

'short.Parse'是對'Parse()'方法組的引用 –

+0

這個問題的答案可能有所幫助:第二個參數的參數類型是什麼? – Mixxiphoid

+0

「和轉換器」。而「轉換器」是? –

回答

5

Array.ConvertAllConverter<TIn, TOut>委託的實例作爲其第二個參數。這個代表的簽名與short.Parse大致相同 - 都返回一個參數的值。

編譯器會將'方法組'轉換爲兼容的委託。這就是所謂的隱式方法組轉換

相比之下,明確創造了代表的是這樣的:

Array.ConvertAll(stringArr, new Converter<string, short>(short.Parse)); 

因此,要回答你的問題:它仍然是一個方法,而不是一個屬性。你在這裏做的是將該方法作爲代表傳遞。您提供了一個函數ConvertAll來調用:當它轉換源數組中的元素時,它將執行short.Parse(element)並使用新數組中返回的值。

+0

謝謝你讓我知道_implicit方法組conversion_。我會閱讀它。 – snippetkid

5

short.Parse是一種方法。但是可以通過一種方法作爲參數。

請注意調用方法和傳遞該方法返回的值(short.Parse())並傳遞方法本身(short.Parse)之間的區別。

在內部,這將傳遞方法的地址,以便該參數的接收者可以調用它。

+0

這是一個挑剔的問題,但'short.Parse'不作爲地址傳遞 - 它用於創建適當類型的委託(可以在結果IL中看到'newobj實例void class [mscorlib ] System.Converter2 [string,int16]; ::。ctor(object,native int)')。沒有人明確地懷疑委託只是內部具有可選實例引用('this')的方法地址,但方法組 - 委託自動「轉換」是由編譯器完成的 - 您無法在任何地方傳遞方法組。 –

+0

@EugenePodskal:所以你承認內部正在傳遞一個方法地址?這不是我說的嗎? –

+0

我絕對承認,但提及方法組 - 委派轉換並且無法將方法組傳遞到任何位置將使此答案在技術上更加正確。這將防止對那些將要閱讀它的方法組有任何誤解。如果現在讀這個答案,他可能會認爲方法組被傳遞,否則它會被傳遞。 –

相關問題