2012-01-13 57 views
12

我問這個問題,因爲每當我試圖調用從即時窗口擴展方法在Visual Studio 2010中,我得到以下錯誤:可擴展的方法來調用從即時窗口

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

如果立即窗口不支持擴展方法,那麼爲什麼當我鍵入我的變量(類型爲IEnumerable<QueryFilter>)後跟一個點時,IntelliSense會列出所有擴展方法?

我在命令窗口中鍵入的內容沒有任何問題,因爲如果我將它複製並粘貼到我的代碼文件中並運行,它就會起作用。

使用Visual Studio 2012對相同的解決方案做同樣的事情可以正常工作。如果我切換回VS2010並且問題依然存在。

回答

1

此行爲由Code Contracts引起,並不僅限於立即窗口,還包括條件斷點窗口。

更新2016年3月1日: 發現這個MSDN Question問爲什麼類型的分辨率並不在我的監視窗口工作。所描述的行爲與我在使用立即窗口時遇到的完全相同。原因也歸因於CodeContracts,並且Microsoft Connect上已經提交了一個錯誤報告。沒有指出是否解決錯誤。

+2

你能否給出一些解釋Code Contracts爲什麼或者如何導致這個問題? – gabe 2012-06-27 13:57:17

+0

沒有解釋。通過設置另一臺機器對其進行測試,驗證它是否正常工作,然後安裝代碼合同,從而導致發生問題。 – 2012-06-28 08:27:11

+0

這不僅僅是我的設置,同樣的事情也發生在我的同事身上。在Visual Studio 2012中運行完全相同的解決方案並在即時窗口中發出命令可以正常工作。切換回VS2010,問題依然存在。 – 2013-05-09 20:59:11

4

擴展方法只是靜態方法。

您應該可以使用例如System.Linq.Enumerable.ToList()

+0

已投票,因爲它沒有回答爲什麼擴展方法無法使用直接窗口內的正常流暢表示法調用的問題。 – bradgonesurfing 2016-10-10 07:15:26

1

擴展方法轉換爲 「Enumerable.ToList」 編譯器通常會轉換

myList.Tolist(); 

要:

Enumerable.ToList(myList); 

在編譯時。如果您願意,我相信您可以使用quickwatch窗口中的擴展方法。

5

這是因爲System.Linq名稱空間不在當前正在調試的上下文中導入。

在你的代碼添加

using System.Linq; 

實施例與Visual Studio 2010

enter image description here

首先倍進口System.LINQ,然後不經using System.LINQ

編輯: 如果名稱空間被導入並且IntelliSense正在顯示方法,那麼它可能是立即窗口的錯誤。 見this bug entry on connect

+0

System.Linq被導入。 – 2012-01-13 13:15:04

+0

@Aphelion你錯了,立即窗口**肯定支持擴展方法**(剛剛測試VS2010)。至少在投票前進行測試-__- – ken2k 2012-01-13 13:38:57

+0

@ ken2k你說得對。我的錯。我已經刪除了downvote;) – Aphelion 2012-01-13 13:40:36

6

擴展方法是語法糖。實際上它們是用this關鍵字實現的static。 您可以使用提供擴展方法的靜態方法調用任何擴展方法。然後您應該傳遞正在擴展的對象作爲第一個參數。

+0

爲什麼IntelliSense列出擴展方法,如果我無法使用該語法調用它們?這是Visual Studio中的錯誤嗎? – 2012-01-13 13:18:42

+0

已投票,因爲它沒有回答爲什麼擴展方法無法使用直接窗口內的正常流暢表示法調用的問題。 – bradgonesurfing 2016-10-10 07:15:09

+0

@bradgonesurfing感謝您的解釋。然而,主要問題是「可以」而不是「爲什麼」。答案是否定的,我也提供了一個解決方法。不幸的是,我不能提供答案,爲什麼第二個問題。 – Aphelion 2016-10-10 09:13:44