我希望这不是一个愚蠢的问题,但是在C#中有什么方法可以实现下面这样的事情吗?
int y = (x => x * x)(9);
我知道我能做到:
delegate int Transformer(int x);
Transformer square = x => x * x;
int y = square(9);
但是,有没有办法做同样的事情更简洁呢?如果不是,有什么好的理由吗?
在vb.net中,这是可序列化的:
<Serializable()>
Class FunctionHolder
Private _F As Func(Of Double, Double)
Sub New()
Me._F = Function(d As Double) d * 5#
End Sub
End Class
然而,对于这个序列化失败:
<Serializable()>
Class FunctionHolder
Private _F As Func(Of Double, Double)
Sub New()
我读到C# lambda可以被不合法地转换为Action或Func,但是lambda不能直接执行--例如,:
int n = (()=>5)(); //doesn't work
int n = ((Func<int>)(()=>5))(); //works
那么,lambda的实际类型是什么,为什么不能直接调用它呢?是因为C#类型的系统比Haskell或Scala“弱”吗?
以下C#的等效VB.NET代码是什么:
Dim moo = Function(x as String) x.ToString()
我认为这应该有效:
var moo = (string x) => x.ToString();
但是这产生了一个编译器错误:Cannot assign lamda expression to an implicitly-typed local variable
经过进一步研究,我发现VB示例中变量moo (moo.GetType())的类型是VB$AnonymousDelegate_0'2[System.String,System.String]。
在
我正在研究一种方法,它需要在不同的地方重复一个小的操作,但是要重复的代码应该是方法的私有代码。最明显的解决方案是嵌套函数。然而,无论我尝试什么,C#编译器都会对我大发雷霆。
大致相当于这个Perl代码段的内容:
my $method = sub {
$helper_func = sub { code to encapsulate };
# more code
&$helper( called whenever needed );
# more code
}
这是我所说的,也是我在C#中要做的。
类中的任何其他方法都不能访问此上下文中的助手函数。在我
在新的C# 6.0中,我们可以使用lambda表达式定义方法和属性。
例如,这个属性
public string Name { get { return First + " " + Last; } }
现在可以定义如下:
public string Name => First + " " + Last;
有关表达式指定的函数成员的信息,您可以在这里找到:
有人知道在使用新语法时是否存在开销吗?它能减缓(或提高)应用程序的效率吗?或者它可能并不重要?
C#语言规范6.5匿名函数转换声明:
..。
具体来说,匿名函数F与委托类型D兼容,条件是:
..。
如果F不包含匿名函数签名,则只要D的参数没有out参数修饰符,则D可以具有任何类型的零或多个参数。
但是,下面的代码会生成错误。
using System;
namespace DelegateAnonymousFunctionExample
{
public delegate void D(int i, int b);
class Program
{
static void Main(string[] args)
{
我有一个一般性问题:在下面的C#代码中,无法创建tFour,编译器向我显示了以下错误:“转换为空的函数返回委托不能返回值”
代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace DelegatesAndLambda
{
class Program
{
public static int ThrowNum(obje