2012-01-13 19 views
12

chiedo alla domanda, perché ogni volta che tento di chiamare un metodo di estensione dalla finestra immediata in Visual Studio 2010 ottengo il seguente errore:può Metodi di estensione essere chiamato da La Finestra Immediata

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?)

Se la finestra immediata non supporta i metodi di estensione, quindi perché quando digito la mia variabile (di tipo IEnumerable<QueryFilter>) seguita da un punto, IntelliSense elenca tutti i metodi di estensione?

Non c'è niente di sbagliato in ciò che sto digitando nella finestra di comando perché se lo copio e lo incollo nel mio file di codice ed eseguo, funziona.

Con Visual Studio 2012 fare la stessa cosa per la stessa soluzione funziona bene. Se torno a VS2010 e il problema persiste.

risposta

1

Questo comportamento è causato da Code Contracts e non è limitato solo alla finestra Immediata ma anche alla finestra Punti di interruzione condizionale.

aggiornamento 1 marzo 2016: trovato questo MSDN Question chiedendo il motivo per cui la risoluzione di tipo non sta funzionando nelle mie finestre di orologi.Il comportamento descritto è esattamente lo stesso che utilizzo quando utilizzo la Finestra Immediata. La causa è anche attribuita a CodeContracts e una segnalazione di bug è stata archiviata su Microsoft Connect. Non è indicato se il bug sia risolto o meno.

+2

Puoi dare qualche spiegazione perché o come i Contratti di codice causano questo problema? – gabe

+0

Nessuna spiegazione. Testato configurando un'altra macchina, verificando che funzionasse correttamente e quindi installando i contratti di codice, dando luogo al problema. –

+0

Non è solo il mio set-up, la stessa identica cosa sta succedendo anche al mio collega. L'esecuzione della stessa identica soluzione in Visual Studio 2012 e l'emissione dei comandi nella Finestra Immediata funzionano correttamente. Tornare a VS2010 e il problema persiste. –

4

I metodi di estensione sono solo metodi statici.

Dovresti poter utilizzare, ad es. System.Linq.Enumerable.ToList()

+0

Votato perché non risponde alla domanda sul perché i metodi di estensione non possono essere chiamati utilizzando la normale notazione fluente dall'interno della finestra immediata. – bradgonesurfing

1

Il metodo di estensione si traduce in "Enumerable.ToList" Il compilatore normalmente convertire

myList.Tolist(); 

A:

Enumerable.ToList(myList); 

durante la fase di compilazione. Credo che tu possa utilizzare i metodi di estensione dalla finestra di Quickwatch se lo desideri.

5

È perché lo spazio dei nomi System.Linq non viene importato nel contesto corrente durante il debug.

Aggiungere

using System.Linq; 

nel codice.

Esempio con Visual Studio 2010:

enter image description here

prime volte con System.LINQ importati, quindi senza using System.LINQ.

EDIT: Se lo spazio dei nomi viene importato e IntelliSense visualizza i metodi, allora potrebbe essere un bug della finestra immediata. Vedere this bug entry on connect.

+0

System.Linq viene importato. –

+0

@Aphelion hai torto, finestra immediata ** supporta sicuramente i metodi di estensione ** (appena testato VS2010). Almeno provalo prima di votare down -__- – ken2k

+0

@ ken2k Hai ragione. Colpa mia. Ho rimosso il downvote;) – Aphelion

6

I metodi di estensione sono lo zucchero di sintassi. Attualmente sono implementati static con la parola chiave this. È possibile chiamare qualsiasi metodo di estensione utilizzando il metodo statico che fornisce il metodo di estensione. Quindi devi passare l'oggetto che viene esteso come primo parametro.

+0

Perché IntelliSense elenca i metodi di estensione, se non riesco a chiamarli usando quella sintassi? Si tratta di un bug in Visual Studio? –

+0

Votato perché non risponde alla domanda sul motivo per cui i metodi di estensione non possono essere chiamati utilizzando la normale notazione fluente dall'interno della finestra immediata. – bradgonesurfing

+0

@bradgonesurfing grazie per aver spiegato. Tuttavia la domanda principale è "può" e non "perché". La risposta è no, e fornisco anche una soluzione alternativa. Sfortunatamente non posso fornire una risposta alla domanda secondaria sul perché. – Aphelion

Problemi correlati