【手记】走近科学之为什么JObject不能调用LINQ扩展方法
2018-06-09 00:40
711 查看
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,所以就这样了。——爆栈
相关文章推荐
- 【C#】对异步请求处理程序IHttpAsyncHandler的理解和分享一个易用性封装 【手记】走近科学之为什么明明实现了IEnumerable<T>的类型却不能调用LINQ扩展方法 【手记】手机网页弹出层后屏蔽底层的滑动响应 【手记】ASP.NET提示“未能创建类型”处理 【Web】一个非常简单的移动web消息框 【手记】解决EXCEL跑SQL遇“查询无法运行或数据库表无法打开...”
- 为什么不能从静态的方法里面调用非静态方法,或变量?
- (转)为什么不能从静态的方法里面调用非静态方法,或变量and类加载机制
- 为什么不能从静态的方法里调用非静态的方法或变量
- 在界面跳转的时候,控制器调用prepareForSegue方法,为什么不能目的控制器的imageView属性赋值
- 多线程:创建Thread为什么要调用start启动,而不能直接调用run方法
- 为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法?
- 为什么不能从静态的方法里面调用非静态方法,或变量?
- java中静态方法为什么不能调用非静态方法或者变量
- 为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来?
- repaint()方法为什么不能调用?
- 为什么我们调用start()方法时会执行run()方法?为什么我们不能直接调用run()方法?他们之间有什么区别?
- 为什么从静态方法里不能调用非静态的方法和变量
- 为什么不能从静态的方法里调用非静态的方法或变量
- 为什么不能从静态的方法里面调用非静态方法,或变量?
- 调用线程对象的start()方法会执行run(),为什么不能直接调用run()方法??
- static方法可以直接从普通方法(regular method)中调用,但是普通方法不能直接从static方法中调用,为什么?
- 为什么静态方法不能调用非静态的变量和方法
- 为什么java静态方法不能调用普通方法?普通方法能调用静态方法?
- 为什么不能从静态的方法里面调用非静态方法,或变量?