我有以下代码:
Func<string, bool> comparer = delegate(string value) {
return value != "0";
};
Run Code Online (Sandbox Code Playgroud)
但是,以下内容无法编译:
var comparer = delegate(string value) {
return value != "0";
};
Run Code Online (Sandbox Code Playgroud)
为什么编译器无法弄清楚它是Func<string, bool>什么?它需要一个字符串参数,并返回一个布尔值.相反,它给了我错误:
无法将匿名方法分配给隐式类型的局部变量.
我有一个猜测,那就是如果编译var版本,如果我有以下内容,它将缺乏一致性:
var comparer = delegate(string arg1, string arg2, string arg3, string arg4, string arg5) {
return false;
};
Run Code Online (Sandbox Code Playgroud)
上面没有意义,因为Func <>只允许最多4个参数(在.NET 3.5中,这就是我正在使用的).也许有人可以澄清这个问题.谢谢.
我们想要在Control.Invoke中匿名调用委托的语法有点麻烦.
我们已经尝试了许多不同的方法,但都无济于事.
例如:
myControl.Invoke(delegate() { MyMethod(this, new MyEventArgs(someParameter)); });
Run Code Online (Sandbox Code Playgroud)
其中someParameter是此方法的本地
以上将导致编译器错误:
无法将匿名方法转换为类型'System.Delegate',因为它不是委托类型
采取方法System.Windows.Forms.Control.Invoke(Delegate方法)
为什么会出现编译时错误:
string str = "woop";
Invoke(() => this.Text = str);
// Error: Cannot convert lambda expression to type 'System.Delegate'
// because it is not a delegate type
Run Code Online (Sandbox Code Playgroud)
但这很好用:
string str = "woop";
Invoke((Action)(() => this.Text = str));
Run Code Online (Sandbox Code Playgroud)
当方法需要普通代表时?
我感兴趣的是,如果可以使用C#编写类似于这个Javascript的代码:
var v = (function()
{
return "some value";
})()
Run Code Online (Sandbox Code Playgroud)
我能做的最多是:
Func<string> vf = () =>
{
return "some value";
};
var v = vf();
Run Code Online (Sandbox Code Playgroud)
但是我想要这样的东西:
// Gives error CS0149: Method name expected
var v = (() =>
{
return "some value";
})();
Run Code Online (Sandbox Code Playgroud)
有没有办法调用函数让它匿名?
我正在尝试学习C#对匿名类型的限制.请考虑以下代码:
var myAwesomeObject = new {
fn1 = new Func<int>(() => { return 5; }),
fn2 = () => { return 5; }
};
Run Code Online (Sandbox Code Playgroud)
所以我们有两个实际上是函数的属性:
fn1:A Func<int>返回5.fn2:返回的lambda函数5.C#编译器很乐意使用fn1,但抱怨fn2:
无法将lambda表达式赋给匿名类型属性.
有人可以解释为什么一个是好的但另一个不是吗?
什么是C#lambda的编译?一个堆栈框架,一个匿名类型的实例,或?
我读过这个问题.这主要回答"为什么"在使用隐式类型功能时不能使用lambda.但是,这个问题的目的是回答编译器生成的构造实际执行lambda的代码.它是一个匿名类型的方法调用(类似于在Java中实现接口的匿名类型吗?),还是只是一个堆栈框架,它引用了闭合变量并接受了参数签名?有些lambda不会关闭任何东西 - 因此编译中有两个不同的结果输出.
我试图理解为什么BeginInvoke方法不接受匿名方法.
void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
if (InvokeRequired)
{
//Won't compile
BeginInvoke(delegate(object sender, ProgressChangedEventArgs e)
{ bgWorker_ProgressChanged(sender, e); });
}
progressBar1.Increment(e.ProgressPercentage);
}
Run Code Online (Sandbox Code Playgroud)
它告诉我'无法从'匿名方法'转换为'System.Delegate',而当我将匿名方法转换为委托时,它确实有效吗?
BeginInvoke((progressDelegate)delegate { bgWorker_ProgressChanged(sender, e); });
Run Code Online (Sandbox Code Playgroud) 代码示例并不适用.它们旨在说明我尝试做我认为可行的方法.
// Error: The name First does not exist...
var Contact = new
{
First = "",
Last = "",
FullName = First + " " + Last
};
// Error: Cannot assign lambda expression to anonymous type property
var Contact = new
{
First = "",
Last = "",
FullName = () => { }
};
Run Code Online (Sandbox Code Playgroud)