2010-04-09 8 views
5

Por lo general, implican genéricos. Pero algunos métodos con genéricos no los tienen, y no todos los métodos de extensión los tienen.¿Cuál es el significado de los corchetes angulares en los métodos LINQ en Intellisense? (Contiene <>, Count <>, Distinct <>, etc.)

Han estado "allí" desde el primer día, todos los hemos visto; pero me di cuenta de que todavía no sé lo que significan, y no puedo encontrar la respuesta en ningún lado. Ahora me está molestando. Google solo muestra resultados que son sobre XML, etc.

¿Está oficialmente documentado en alguna parte? Gracias.

EDIT: Bueno, eso es simplemente genial. Como acabo de crear una cuenta para hacer mi primera publicación de Stack Overflow, para obtener una respuesta a esta pregunta candente; No tengo permiso para publicar mi bonita foto de Intellisense ni crear una nueva etiqueta "corchetes angulares". Me encanta Stack Overflow, pero ... ¡qué bienvenida!

Tal vez mi problema es que en realidad no se llaman "corchetes angulares" ... ??

De todos modos, supongo que si usted realmente quiere ver a mi hermosa pantalla se puede ir manualmente a:

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

me LEVANTACOLA favor para que pueda incluirlo en el post, gracias. ;)

+0

ReSharper los oculta ... cuando lo instaló, puede ir a 'Opciones -> IntelliSense -> General' y elegir el intellisense propio de ReSharper o el de VS – tanascius

+0

Gracias a todos por las respuestas y los votos. Sé genéricos, pero no estaba seguro de la designación específica de los corchetes angulares (en Intellisense). Supongo que mi confusión fue ver dos versiones para algo como: nuevo int [] {1, 2} .Sum ... uno (sin paréntesis angulares) para un método de extensión en una clase genérica, y uno (con ángulo corchetes) para un método de extensión * genérico * en una clase genérica. Agradezco las explicaciones y la confirmación. –

+0

Por cierto, ¿alguien tiene un MSDN u otro enlace que vincule métodos genéricos específicamente a esa marca en Intellisense? No es que no te crea ... es extraño que no pueda encontrar * nada *. –

Respuesta

8

Estos métodos son genéricos.

Sin embargo, el compilador infiere automáticamente el parámetro de tipo genérico de la llamada al método, por lo que no necesita utilizar los corchetes al llamar al método.

Por ejemplo, si tiene una IEnumerable<int> myNumbers, las siguientes cuatro afirmaciones son equivalentes:

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

En el primer y tercer llamadas, el compilador infiere el parámetro int porque myNumbers es un IEnumerable<int>.

El método Count extensión se declaró (en System.Core.dll) como esto:

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

¡Buena explicación, gracias! –

2

que son para los genéricos. Cuando utiliza las funciones, no siempre tiene que ponerlas porque, en muchos casos, el compilador puede resolverlas por contexto.

1

Son generic method signatures. Le sugiero que aprenda sobre ellos.

Un par de cosas interesantes a tener en cuenta sobre los genéricos: En primer lugar, no son genéricos después de la compilación. Todos los tipos se resuelven y se configuran en piedra antes de ejecutar su aplicación. En segundo lugar, el compilador a menudo puede descubrir a qué se refiere, por lo que no tiene que ser explícito al respecto. Por ejemplo, si la firma de un método es DoSomething<T>(t withThis), puede invocar este método como DoSomething<string>("with me")o puede omitir el tipo genérico: DoSomething("with me"). Esto se debe a que el compilador examina los tipos pasados ​​al método como argumentos y calcula el parámetro de tipo para el método. Increíble.

+0

Buen enlace. Ese es el tipo de cosa que estaba buscando, gracias. –

0

El libro de Jon Skeet C# in Depth entra en los genéricos y detalla en detalle y borró mucho de esto para mí, lo recomiendo encarecidamente.

Cuestiones relacionadas