2010-04-09 28 views
5

Genellikle jenerik içerir. Ancak jenerikli bazı yöntemler bunlara sahip değildir ve tüm uzantı yöntemlerinde bu tür bir yöntem yoktur.Intellisense'deki LINQ yöntemleri üzerindeki açılı ayraçların anlamı nedir? (<>, Count <>, Distinct <>, içerir.)

Onlar sadece ilk günden beri "orada", hepimiz onları gördüm ettik; ama anladım ne demek istediğimi hala bilmiyorum ve cevabı hiçbir yerde bulamıyorum. Şimdi gerçekten beni rahatsız ediyor. Google sadece XML ile ilgili sonuçları döndürür.

Bu resmi olarak herhangi bir yerde belgelenmiş mi? Teşekkürler.

DÜZENLEME: Aslında bu harika. İlk Stack Overflow yayınımı yapmak için yeni bir hesap oluşturduğumdan, bu yanan soruya bir cevap almak için; Güzel Intellisense resmimi yayınlamaya veya yeni bir "köşeli parantez" etiketi oluşturmama izin verilmiyor. Stack Overflow'u seviyorum ama ... ... ne hoş geldiniz!

Belki de benim sorunum aslında "köşeli parantezler" olarak adlandırılmadıkları ...?

Distinct>< http://www.freeimagehosting.net/uploads/6a6c2f3268.png

, bu yüzden yayında bunu içerebilir lütfen sayesinde beni çarpmak:

Neyse, gerçekten benim güzel ekran görmek istiyorsanız manuel gidebiliriz sanırım. ;)

+0

ReSharper onları yüklediğinde gizler ... '' Seçenekler -> IntelliSense -> Genel '' seçeneğini seçebilir ve ReSharper'ın kendi intellisense'i veya VS – tanascius

+0

'dan birini seçebilirsiniz. Yanıtlar ve oylar için herkese teşekkürler. Jenerik bildiğimi biliyorum, ancak köşeli parantezlerin (Intellisense'de) özel atamalarından emin değildim. Sanırım karmaşası, bir şunun gibi iki sürümü görüyordu: yeni int [] {1, 2} .Sum ... bir (genel bir sınıfta bir uzantı yöntemi için) (bir açılı ayraç olmadan) ve bir (açı ile) genel bir sınıfta bir * jenerik * uzantısı yöntemi için parantez)! Açıklamaları ve onayları takdir ediyorum. –

+0

Bu arada, herhangi biri, Intellisense'deki bu işarete özel olarak bir MSDN veya başka bir bağlama bağlama yöntemleri var mı? Sana inanmadığımdan değil ... ... bir şey bulamadığımma garip geliyor. –

cevap

8

Bu yöntemler geneldir. Ancak, derleyici yöntem çağrısından genel tür parametresini otomatik olarak girer, böylece yöntemi çağırırken köşeli parantezleri kullanmanız gerekmez. Bir IEnumerable<int> myNumbers varsa

Örneğin, aşağıdaki dört ifade eşdeğerdir: myNumbers bir IEnumerable<int> çünkü birinci ve üçüncü aramalarda

myNumbers.Count(); 
myNumbers.Count<int>(); 
Enumerable.Count(myNumbers); 
Enumerable.Count<int>(myNumbers); 

, derleyici int parametreyi infers.

Count uzatma yöntemi, bu gibi (System.Core.dll olarak) ifade edilir:

public static int Count<TSource>(this IEnumerable<TSource> source); 
+1

Güzel açıklama, teşekkürler! –

2

da jenerik içindir. Fonksiyonları kullandığınız zaman, çoğu zaman koymayınız çünkü pek çok durumda derleyici bağlamı belirleyebilir.

1

generic method signatures. Onlar üzerinde öğrenmenizi öneririm.

Jenerikler hakkında dikkat edilmesi gereken birkaç ilginç şey: Birincisi, derlemeden sonra jenerik değiller. Uygulamanızı çalıştırmadan önce tüm türler çözülür ve taşa yerleştirilir. İkinci olarak, derleyici genellikle ne demek istediğini anlayabiliyor, bu yüzden bunun hakkında açık olmanız gerekmiyor. Örneğin, bir yöntem imzası DoSomething<T>(t withThis) ise, DoSomething<string>("with me")veya gibi bu yöntemi çağırabilirsiniz, genel türünü atlayabilirsiniz: DoSomething("with me"). Bunun nedeni, derleyicinin argüman olarak yönteme geçirilen türlere bakması ve yöntemin type parametresini ortaya çıkarmasıdır. Muhteşem.

+0

İyi bağlantı. Aradığım şey bu, teşekkür ederim. –

0

Jon Skeet'in kitabı C# in Depth jeneriklere ve linq'e gider ve bunu benim için pek çok şeyden temizler - Kesinlikle tavsiye ederim.

İlgili konular