比如Json.NET的JObject明明實現了IEnumerable<T>,具體來說是IEnumerable<KeyValuePair<string, JToken>>,按說JObject類型的對象是可以直接調用Select、Where等linq擴展方法的,但偏偏就是不行,代碼如下: 究竟是人性的扭 ...
比如Json.NET的JObject明明實現了IEnumerable<T>,具體來說是IEnumerable<KeyValuePair<string, JToken>>,按說JObject類型的對象是可以直接調用Select、Where等linq擴展方法的,但偏偏就是不行,代碼如下:
using System.Linq; ... var jobj = new JObject(); var xxx = jobj.Select(x=>x); //報錯:JObject未包含Select定義,也不存在第1個參數為JObject的Select擴展方法... foreach(var x in jobj) { } //可以 var xxx = ((IEnumerable<KeyValuePair<string, JTokin>>)jobj).Select(x=>x); //也可以
究竟是人性的扭曲還是道德的淪喪?答案就在:
因為JObject除了本身實現了一個IEnumerable<KeyValuePair<string, JToken>>,它實現的另一個介面JContainer也實現了一個IEnumerable<JToken>,等於JObject直接和間接實現了兩個不同的IEnumerable<T>,當.Select的時候編譯器不能確定調用哪個類型的Select,所以就這樣了。——爆棧
- EOF -