2010-04-09 12 views
5

Di solito riguardano i generici. Ma alcuni metodi con generici non li hanno, e non tutti i metodi di estensione li hanno.Qual è il significato delle parentesi angolari sui metodi LINQ in Intellisense? (Contiene <>, Conteggio <>, Distinto <>, ecc.)

Sono appena "stati lì" dal primo giorno, li abbiamo visti tutti; ma ho capito che non so ancora cosa significano, e non riesco a trovare la risposta da nessuna parte. Ora mi sta davvero infastidendo. Google mostra solo risultati che riguardano XML, ecc.

È documentato ufficialmente da qualche parte? Grazie.

EDIT: Beh, è ​​semplicemente fantastico. Da quando ho creato un account per creare il mio primo post di Overflow dello stack, per ottenere una risposta a questa domanda scottante; Non sono autorizzato a pubblicare la mia bella immagine Intellisense, né creare un nuovo tag "parentesi angolari". Adoro Stack Overflow, ma ... che benvenuto!

Forse il mio problema è che in realtà non si chiamano "parentesi angolari" ... ??

In ogni caso, credo che se si vuole veramente vedere la mia bella screenshot si potrebbe andare manualmente:

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

mi urtare prega così posso includerlo nel post, grazie. ;)

+0

ReSharper li nasconde ... quando lo hai installato, puoi goto 'Opzioni -> IntelliSense -> Generale' e scegli il proprio intellisense di ReSharper o quello di VS – tanascius

+0

Grazie a tutti per le risposte e i voti. Conosco i generici, ma non ero sicuro della designazione specifica delle parentesi angolari (in Intellisense). Immagino che la mia confusione stia vedendo due versioni per qualcosa di simile: new int [] {1, 2} .Sum ... uno (senza parentesi angolari) per un metodo di estensione su una classe generica e uno (con angolo parentesi) per un metodo di estensione * generico * su una classe generica! Apprezzo le spiegazioni e la conferma. –

+0

A proposito, qualcuno ha un MSDN o un altro link che lega i metodi generici specificamente a quel marchio in Intellisense? Non che io non ti creda ... è solo strano che non riesca a trovare * qualsiasi cosa *. –

risposta

8

Questi metodi sono generici.

Tuttavia, il compilatore deduce automaticamente il parametro di tipo generico dalla chiamata al metodo, quindi non è necessario utilizzare le parentesi quando si chiama il metodo.

Per esempio, se avete un IEnumerable<int> myNumbers, le seguenti quattro affermazioni sono equivalenti:

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

Nella prima e terza convocazione, il compilatore deduce il parametro int perché myNumbers è un IEnumerable<int>.

Il metodo Count estensione è dichiarata (in System.Core.dll) come questo:

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

Bella spiegazione, grazie! –

2

lo sono per i farmaci generici. Quando usi le funzioni non sempre devi inserirle perché in molti casi il compilatore può capirlo dal contesto.

1

Sono generic method signatures. Vorrei suggerirvi di approfondire.

Un paio di cose interessanti da notare sui generici: primo, non sono generici dopo la compilazione. Tutti i tipi sono risolti e incastonati prima di eseguire l'app. In secondo luogo, il compilatore può spesso capire cosa intendi, quindi non devi essere esplicito a riguardo. Ad esempio, se una firma del metodo è DoSomething<T>(t withThis), è possibile richiamare questo metodo come DoSomething<string>("with me")o, è possibile omettere il tipo generico: DoSomething("with me"). Questo perché il compilatore esamina i tipi passati nel metodo come argomenti e calcola il parametro type per il metodo. Eccezionale.

+0

Buon collegamento. Questo è il genere di cose che stavo cercando, grazie. –

0

Il libro di Jon Skeet C# in Depth entra in generici e in linq in dettaglio e ha chiarito molto per me - lo consiglio vivamente.

Problemi correlati