2012-01-13 12 views
12

hago la pregunta porque cada vez que intenta llamar a un método de extensión desde la ventana Inmediato en Visual Studio 2010 me sale el siguiente error:Puede métodos de extensión puede llamar desde la ventana inmediata

System.Collections.Generic.IEnumerable' does not contain a definition for 'ToList' and no extension method 'ToList' accepting a first argument of type 'System.Collections.Generic.IEnumerable' could be found (are you missing a using directive or an assembly reference?)

Si la ventana Inmediato no es compatible con los métodos de extensión, entonces ¿por qué es que cuando escribo mi variable (del tipo IEnumerable<QueryFilter>) seguido de un punto, el IntelliSense enumera todos los métodos de extensión?

No hay nada de malo con lo que estoy escribiendo en la ventana Comando porque si lo copio y lo pego en mi archivo de código y lo ejecuto, funciona.

Con Visual Studio 2012 haciendo lo mismo para la misma solución funciona bien. Si cambio a VS2010 y el problema persiste.

Respuesta

1

Este comportamiento está causado por Code Contracts, y no se limita solo a la ventana Inmediato, sino también a la ventana Puntos de interrupción condicional.

Actualización 01 de marzo de, 2016: encontrado este MSDN Question preguntando por qué tipo de resolución no está trabajando en las ventanas de mi reloj.El comportamiento descrito es exactamente el mismo que experimento cuando uso la Ventana Inmediata. La causa también se atribuye a CodeContracts y se ha presentado un informe de error en Microsoft Connect. No se indica si el error se resuelve o no.

+2

¿Puede dar alguna explicación de por qué o cómo los Contratos de código causan este problema? – gabe

+0

Sin explicación. Lo probé configurando otra máquina, verificando que funcionó correctamente y luego se instaló el código de los contratos, lo que ocasionó el problema. –

+0

No es solo mi configuración, exactamente lo mismo le está sucediendo a mi colega. Ejecutar exactamente la misma solución en Visual Studio 2012 y emitir los comandos en la ventana Inmediato funciona bien. Vuelva a cambiar a VS2010 y el problema persiste. –

4

Los métodos de extensión son solo métodos estáticos.

Debe poder utilizar, p. System.Linq.Enumerable.ToList()

+0

Votado porque no responde la pregunta de por qué no se puede llamar a los métodos de extensión utilizando la notación normal con fluidez desde dentro de la ventana inmediata. – bradgonesurfing

1

El método de extensión se traduce en "Enumerable.ToList" El compilador normalmente convertir

myList.Tolist(); 

Para:

Enumerable.ToList(myList); 

durante el tiempo de compilación. Creo que puede usar métodos de extensión desde la ventana de QuickWatch si así lo desea.

5

Esto se debe a que el espacio de nombres System.Linq no se importa en el contexto actual mientras se depura.

Añadir

using System.Linq; 

en el código.

ejemplo con Visual Studio 2010:

enter image description here

primeras veces con System.LINQ importados, a continuación, sin using System.LINQ.

EDITAR: Si el espacio de nombres es importado y IntelliSense está mostrando los métodos, entonces podría ser un error de la ventana Inmediato. Ver this bug entry on connect.

+0

Se importa System.Linq. –

+0

@Aphelion está equivocado, la ventana Inmediato ** definitivamente admite métodos de extensión ** (acaba de probar VS2010). Al menos pruébelo antes de votar -__- – ken2k

+0

@ ken2k Tiene razón. Mi error. He eliminado el voto a favor;) – Aphelion

6

Los métodos de extensión son azúcar de sintaxis. En realidad, están implementados static con la palabra clave this. Puede llamar a cualquier método de extensión utilizando el método estático que proporciona el método de extensión. Luego debe pasar el objeto que se está extendiendo como el primer parámetro.

+0

¿Por qué IntelliSense enumera los métodos de extensión, si no puedo llamarlos usando esa sintaxis? ¿Es esto un error en Visual Studio? –

+0

Votado porque no responde la pregunta de por qué no se puede llamar a los métodos de extensión utilizando la notación normal con fluidez desde dentro de la ventana inmediata. – bradgonesurfing

+0

@bradgonesurfing gracias por explicarme. Sin embargo, la pregunta principal es "puede" y no "por qué". La respuesta es no, y también proporciono una solución alternativa. Desafortunadamente no puedo dar respuesta a la pregunta secundaria por qué. – Aphelion

Cuestiones relacionadas