[英]C# dynamic and working with IEnumerable collections
在今天遇到Massive的一些問題后,我決定創建一個簡單的測試程序來說明問題。 我想知道,我在這段代碼中犯的錯誤是什么:
var list = new List<string>
{
"Hey"
};
dynamic data = list.Select(x => x);
var count = data.Count();
最后一行拋出錯誤: 'object'不包含'Count'的定義
為什么“數據”被視為對象? 出現此問題是因為我正在調用擴展方法嗎?
以下代碼有效:
var list = new List<string>
{
"Hey"
};
dynamic data = list.Select(x => x);
foreach (var s in data)
{
}
為什么在這種情況下“數據”被正確地視為IEnumerable?
是的,那是因為Count()
是一種擴展方法。
擴展方法形式的動態類型不支持擴展方法,即調用它們就像實例方法一樣。 ( 來源 )
foreach (var s in data)
工作,因為data
必須實現IEnumerable
作為foreach
源 - 在執行期間執行(IEnumerable)data
轉換。
在嘗試執行以下操作時,您可以看到該機制:
dynamic t = 1;
foreach (var i in t)
Console.WriteLine(i.ToString());
運行時拋出異常: Cannot implicitly convert type 'int' to 'System.Collections.IEnumerable'
似乎擴展方法不適用於動態對象(請參閱Jon的回答 )。 但是,您可以直接將它們稱為靜態方法:
var count = Enumerable.Count(data); // works
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.