今天写winform的时候遇到一个问题,提示: 无法将 lambda 表达式 转换为类型“System.Delegate”,因为它不是委托类型, 主要是为了在子线程中更新UI线程,在wpf中同样的写法不会出现这个问题. this.Invode(() => { xxx }); 对于Control.Invoke()来说,可以接收ThreadStart和MethodInvode两种方法,必须要指定执行的方法.可以更改为如下代码: this.Invode(new MethodInvoker(() =>…
http://blog.csdn.net/xiaochongchong1248/archive/2009/11/20/4841193.aspx?1271573283 编程环境要求:VS2008/FX2.0 众所周知,从VS2005/FX2.0起,在多线程环境下是不允许跨线程修改主线程上窗口控件的. 例如: private void button1_Click(object sender, EventArgs e) {     Thread t = new Thread(new ThreadSta…
转自:http://www.cnblogs.com/xiaofei59/archive/2010/11/25/1887285.html 异常{ 无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型 } 委托实际上是把方法名作为参数,但是若有好多个方法时,就要指明是哪个参数 查看如下代码: this.Invoke(delegate { MessageBox.Show("t4"); }); 熟悉winform的开发者都知道,this是一个窗体的实例,故不做另外…
异常{ 无法将 匿名方法 转换为类型"System.Delegate",因为它不是委托类型 } 委托实际上是把方法名作为参数,但是若有好多个方法时,就要指明是哪个参数  查看如下代码: this.Invoke(delegate                 {                     MessageBox.Show("t4");                 }); 熟悉winform的开发者都知道,this是一个窗体的实例,故不做另外解释.该代…
很早就碰到了这个问题,当时也没有深入的研究,趁着空闲,遂把这个问题研究清楚. (一)普通案例 下面从一个普通的案例入手,下面准备两个List集合,都是放在内存里面的(需要模拟到远端执行的时候,我们是通过AsQueryable()来进行的) var users = new List<Usernew User() {Id = 1, Name = "zz", CompanyId = 1}, new User(){Id = 2, Name = "fyh",Compan…
假设要找出整型集合中小于5的数. static void Main(string[] args) { IEnumerable<int> source = new List<int>(){2, 3, 4, 5, 6, 7, 8, 9,10, 11}; var result = GetNumbersLessThanFive(source); foreach (int n in result) { Console.WriteLine(n); } } static IEnumerable&…
this.BeginInvoke(() => { this.btnQuery.Enabled = false; //禁用查询 }); 跨线程调用时,编译上面的代码将提示 对于Control.Invoke()来说,任何的代理类型都是可接受的,也就是说ThreadStart和MethodInvoker都是可以接受的类型.这样编译器反而不知道应该用哪个代理去匹配匿名函数了,导致了编译错误的发生. 知道了原因,问题就很容易解决了.我们只需要加上MethodInvoker这个wrapper就能使用匿名函数…
 使用C++风格的数组.不须要管理内存. array要注意不要溢出,由于它是栈上开辟内存. array适用于不论什么类型 #include<iostream> #include<array> #include<vector>   //C++的标准库 #include<string>   //C++字符串 #include <stdlib.h> using  std::array; //静态数组,栈上 using std::vector; //…
取数据库中的数据时,数据库中的字段有可能是空值,虽然Linq中的Field方法和SetField方法都可以处理可以为 null 的类型,不必像前面的示例那样检查 Null 值,我们再用Field将一些可空的值赋给实体的属性时,有可能会报错,因为实体的属性是可空类型,例如: 角色(SmRole)实体有如下可空类型的创建时间的属性 public virtual DateTime? Createdtime { get { return _createdtime; } set { _bIsChanged…
原因是Edit视图中有@Html.DropDownListFor(m => m.BirthdayAD... 但是没有从Controller中没有设置值…
在WinForm中,不允许非UI线程访问UI,如果非UI线程需要跨线程调用UI控件,通常的解决办法是使用Control类中的Invoke方法,传递给该方法一个委托和委托调用的参数列表(params []object args),任何委托类型都可以,通过委托来访问UI.其内部是,非UI线程把委托送到UI线程中,让UI线程去调用这个委托. 一般一个方法的参数是委托类型,如果使用委托实例,那就还需要额外定义一个和委托签名一致的方法,比较麻烦.而我一般是使用匿名方法,因为匿名方法方便,不需要额外的声明的…
最近看了赵姐夫的这篇博客http://blog.zhaojie.me/2009/08/recursive-lambda-expressions.html,主要讲的是如何使用 Lambda 编写递归函数.其中提到了不动点组合子这个东西,这个概念来自于函数式编程的世界,直接理解起来可能有些困难,所以我们可以一起来尝试使用 Lambda 来编写递归函数,以此来探索不动点组合子的奥秘.在阅读过程中,我们可以使用"C# 交互窗口"或者 Xamarin WorkBook 来运行给出的代码,因为 L…
委托 委托是执行安全的类,它的使用方式与类类似(即都需要定义再实例化),不同在于,类在实例化之后叫对象或类的实例,但委托在实例化后仍叫委托,委托可以把函数作为参数传递. 语法声明: delegate <return type> <delegate-name> <parameter list> 委托使用的步骤: 声明委托类型(delegate关键字) 使用该委托类型声明一个委托变量并增加方法 调用委托执行方法 定义两个方法 public void ChineseSayHi…
C#3.0(.NET3.5)中引入了Lambda表达式和LINQ.Lambda表达式是使用一些特殊语法表示匿名方法的较短方法. 最基本的Lambda表达式语法如下: (参数列表)=>{方法体} 说明: 1.参数列表中的参数类型可以是明确类型或者推断类型. 2.如果是推断类型,则参数的数据类型将由编辑器根据上下文自动推断出来. 让我们看看Lambda表达式是如何从匿名方法演变而来的. 相关示例: == ; }; 1.Lambda表达式从匿名方法演变,首先删除delegate关键字和参数类型并添加L…
匿名函数 匿名函数(Anonymous Function)是表示“内联”方法定义的表达式.匿名函数本身及其内部没有值或者类型,但是可以转换为兼容的委托或者表达式树类型(了解详情).匿名函数转换的计算取决于转换的目标类型:如果是委托类型,则转换计算为引用匿名函数所定义的方法的委托:如果是表达式树类型,则转换将计算以对象结构形式表示方法结构的表达式树. 匿名函数有两种语法风格:Lambda表达式(lambda-expression)和匿名方法表达式(anonymous-method-expressi…
很早之前就接触到了委托,但是一直对他用的不是太多,主要是本人是菜鸟,能写的比较高级的代码确实不多,但是最近在看MSDN微软的类库的时候,发现了微软的类库好多都用到了委托,于是决定好好的研究研究,加深一下自己对他的印象,顺便把自己的感悟和想法写出来,以便自己能有更深的理解,由于本人水平有限,也欢迎大家多多探讨,有问题大家一起解决一起进步. MSDN上面对委托的定义是:delegate 是表示对具有特定参数列表和返回类型的方法的引用的类型.在我看来委托的特性主要在: 1.把一个方法当做一个参数传递给…
Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数.Lambda 表达式对于编写 LINQ 查询表达式特别有用. 若要创建 Lambda 表达式,需要在 Lambda 运算符 => 左侧指定输入参数(如果有),然后在另一侧输入表达式或语句块. 例如,lambda 表达式 x => x * x 指定名为 x 的参数并返回 x 的平方值. 如下面的示例所示,你可以将此表达式分配给委托类型: C…
在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在不牺牲可读性的前提下,进一步简化了委托. LINQ的基本功能就是创建操作管道,以及这些操作需要的任何状态.这些操作表示了各种关于数据的逻辑,例如数据筛选,数据排序等等.通常这些操作都是用委托来表示.Lambda表达式是对LINQ数据操作的一种符合语言习惯的表示方式. Lambda表达式不仅可以用来创…
Visual Studio 2013 其他版本 Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数. Lambda 表达式对于编写 LINQ 查询表达式特别有用. 若要创建 Lambda 表达式,需要在 Lambda 运算符 => 左侧指定输入参数(如果有),然后在另一侧输入表达式或语句块. 例如,lambda 表达式 x => x * x 指定名为 x 的参数并返回 x 的平方值. 如下…
12.1.委托概述 12.1.2 委托的数据类型 为了减少重复代码数量,可以将比较方法作为参数传递给 BubbleSort()方法.此外,为了将方法作为参数传递,必须有一个能够标识方法的数据类型--也就是委托.这里的委托类型是 ComparisonHandler .  c# 2.0之前的写法 class DelegateSample { static void Main(string[] args) { //int[] arr = { 10, 20, 30, 40, 50 }; int[] ar…
前言 C# 3.0 引入了 Lambda 表达式,程序员们很快就开始习惯并爱上这种简洁并极具表达力的函数式编程特性. 本着知其然,还要知其所以然的学习态度,笔者不禁想到了几个问题. (1)匿名函数(匿名方法和Lambda 表达式统称)如何实现的? (2)Lambda表达式除了书写格式之外还有什么特别的地方呢? (3)匿名函数是如何捕获变量的? (4)神奇的闭包是如何实现的? 本文将基于CIL代码探寻Lambda表达式和匿名方法的本质. 笔者一直认为委托可以说是C#最重要的元素之一,有很多东西都是…
在说明Lambda相关知识前,我们需要了解Lambda表达式常用于LINQ,那么我们来聊下LINQ. LINQ的基本功能就是创建操作管道,以及这些操作需要的任何状态.这些操作表示了各种关于数据的逻辑:如何过滤.如何排序以及如何将不同的数据源连接在一起,等等.执行委托只是LINQ的众多能力之一.为了富有效率地使用数据库和其他查询引擎,我们需要以一种不同的方式来表示管道中的各个操作.这种不同的方式就可以使用Lambda表达式来表现.下面分别使用委托(使用匿名函数)和Lambda表达式来作出同样的事情…
在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在不牺牲可读性的前提下,进一步简化了委托. LINQ的基本功能就是创建操作管道,以及这些操作需要的任何状态.这些操作表示了各种关于数据的逻辑,例如数据筛选,数据排序等等.通常这些操作都是用委托来表示.Lambda表达式是对LINQ数据操作的一种符合语言习惯的表示方式. Lambda表达式不仅可以用来创…
https://msdn.microsoft.com/zh-cn/library/bb397687.aspx Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数.通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数.Lambda 表达式对于编写 LINQ 查询表达式特别有用. 若要创建 Lambda 表达式,需要在 Lambda 运算符 => 左侧指定输入参数(如果有),然后在另一侧输入表达式或语句块.例如,lambda 表达式 x => x…
LINQ的基本功能就是创建操作管道,以及这些操作需要的任何状态. 为了富有效率的使用数据库和其他查询引擎,我们需要一种不同的方式表示管道中的各个操作.即把代码当作可在编程中进行检查的数据. Lambda表达式不仅可以用他们创建委托实例,而且C#编译器也能将他们转换成表达式树——用于表示Lambda表达式逻辑的一种数据结构.简言之——Lambda表达式用符号语言习惯的方法来表示LINQ数据管线中的操作. 作为委托的Lambda表达式 Lambda有特殊转换规则:表达式的类型本身并非委托类型,但它可…
Lambda表达式和表达式树 先放一张委托转换的进化图 看一看到lambda简化了委托的使用. lambda可以隐式的转换成委托或者表达式树.转换成委托的话如下面的代码: Func<string, int> getLength = s => s.Length; 转换成表达式树的话是下面的代码: Expression<Func<string, int>> getLength = s => s.Length; 委托方面的东西前面都做了详细的介绍.我们主要学习表达…
Lambda 表达式是一种可用于创建"委托"或"表达式目录树"类型的"匿名函数".通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数.Lambda 表达式对于编写 LINQ 查询表达式特别有用. 创建 Lambda 表达式:[1]在 Lambda 运算符 "=>"左侧指定输入参数(如果有):[2]然后在另一侧输入表达式或语句块. 例如,lambda 表达式 x => x * x 指…
Lambda 表达式是一种可用于创建 委托 或 表达式目录树 类型的 匿名函数 . 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数. Lambda 表达式对于编写 LINQ 查询表达式特别有用. 若要创建 Lambda 表达式,需要在 Lambda 运算符 =>左侧指定输入参数(如果有),然后在另一侧输入表达式或语句块. 例如,lambda 表达式 x => x * x 指定名为 x 的参数并返回 x 的平方值. 如下面的示例所示,你可以将此表达式分配给委…
形参列表=>函数体 函数体多于一条语句的可用大括号括起. 类型 可以将此表达式分配给委托类型,如下所示:   delegate int del(int i); del myDelegate = x=>{return x*x;}; );//j=25 创建表达式目录树类型: using System.Linq.Expressions; //... Expression <del>=x=>x*x; => 运算符具有与赋值运算符 (=) 相同的优先级,并且是右结合运算符. La…
什么是Lambda 表达式? "Lambda表达式"实际上是一个方法,只不过该方法是一个匿名方法(就是没有名字的方法(函数),就是说只有在定义的时候能调用,在其他地方就不能调用了),是一种高效的类似于函数式编程的表达式,  (@高效 : 只在一个地方用用完就不用了,没必要单独写一个方法) 所有Lambda表达式都使用Lambda运算符 =>; ,该运算符读作"goes to".该标记在 lambda 表达式中用来将左侧的输入变量与右侧的 lambda 体分离.…