Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#委托和函数调用_C#_Function_Delegates - Fatal编程技术网

C#委托和函数调用

C#委托和函数调用,c#,function,delegates,C#,Function,Delegates,假设我有这个功能: Func<string> fs = () => "test"; var st = fs(); 然而,我似乎无法定义函数,然后立即调用它。这在另一方面可能吗 这是可能的: var st = (new Func<string>(() => "test"))(); var st=(新函数(()=>“测试”)(); 但是很乱 为了澄清,是否可以定义匿名函数而不必指定所使用的委托类型,即是否有方法让编译器直接从函数推断类型?只需将表达式转换为正

假设我有这个功能:

Func<string> fs = () => "test";
var st = fs();
然而,我似乎无法定义函数,然后立即调用它。这在另一方面可能吗

这是可能的:

var st = (new Func<string>(() => "test"))();
var st=(新函数(()=>“测试”)();
但是很乱


为了澄清,是否可以定义匿名函数而不必指定所使用的委托类型,即是否有方法让编译器直接从函数推断类型?

只需将表达式转换为正确的类型,如下所示:

var st = ((Func<string>) (() => "test"))();
var st=((Func)(()=>“test”)();

只需将表达式强制转换为以下正确类型:

var st = ((Func<string>) (() => "test"))();
var st=((Func)(()=>“test”)();

您需要以某种方式指定类型。其他人已经演示了如何内联执行此操作

还有另一种可能性:创建一个helper方法。因为方法的参数已经定义,所以在调用方法时不必自己定义类型

static class Execute
{
    public static T Func<T>(Func<T> func)
    {
        return func();
    }
}

您需要以某种方式指定类型。其他人已经演示了如何内联执行此操作

还有另一种可能性:创建一个helper方法。因为方法的参数已经定义,所以在调用方法时不必自己定义类型

static class Execute
{
    public static T Func<T>(Func<T> func)
    {
        return func();
    }
}

基本上,编译器不知道它是表达式树还是匿名方法。如果要使用后者,必须在过程中的某个位置指定一个类型

如果不希望将lambda转换为内联,则应使用帮助器方法:

static TResult call<TResult>(Func<TResult> f)
{
    return f();
}
static TResult call<T1, TResult>(Func<T1,TResult> f, T1 arg1)
{
    return f(arg1);
}
static TResult call<T1, T2, TResult>(Func<T1, T2, TResult> f, T1 arg1, T2 arg2)
{
    return f(arg1, arg2);
}
// and so on...

static void Main(string[] args)
{
    Console.WriteLine(call(() => "test"));
}
静态TResult调用(Func f)
{
返回f();
}
静态TResult调用(Func f,T1 arg1)
{
返回f(arg1);
}
静态TResult调用(Func f、T1 arg1、T2 arg2)
{
返回f(arg1、arg2);
}
//等等。。。
静态void Main(字符串[]参数)
{
控制台写入线(调用(()=>“测试”);
}

基本上,编译器不知道它是表达式树还是匿名方法。如果要使用后者,必须在过程中的某个位置指定一个类型

如果不希望将lambda转换为内联,则应使用帮助器方法:

static TResult call<TResult>(Func<TResult> f)
{
    return f();
}
static TResult call<T1, TResult>(Func<T1,TResult> f, T1 arg1)
{
    return f(arg1);
}
static TResult call<T1, T2, TResult>(Func<T1, T2, TResult> f, T1 arg1, T2 arg2)
{
    return f(arg1, arg2);
}
// and so on...

static void Main(string[] args)
{
    Console.WriteLine(call(() => "test"));
}
静态TResult调用(Func f)
{
返回f();
}
静态TResult调用(Func f,T1 arg1)
{
返回f(arg1);
}
静态TResult调用(Func f、T1 arg1、T2 arg2)
{
返回f(arg1、arg2);
}
//等等。。。
静态void Main(字符串[]参数)
{
控制台写入线(调用(()=>“测试”);
}

为什么要这样做?这对于包装更复杂的函数非常有用,我想在函数调用中临时作用域一些变量,为什么要这样做?这对于包装更复杂的函数非常有用,我想在函数调用中临时作用域一些变量因为它有较少的弯曲括号。你知道编译器最终是否能够在没有类型减速的情况下支持函数吗?@MichaelEdwards:我不知道编译器将支持什么。我可以想象,实现这一点是可能的——afaik F#已经有了这一点——但这并不意味着它将在某个时候实现。顺便说一句:在调用
Func
时,您不需要泛型类型参数(请参阅更新的用法)。我更喜欢这个参数,因为它的括号较少。你知道编译器最终是否能够在没有类型减速的情况下支持函数吗?@MichaelEdwards:我不知道编译器将支持什么。我可以想象,实现这一点是可能的——afaik F#已经有了这一点——但这并不意味着它将在某个时候实现。顺便说一句:调用
Func
时不需要泛型类型参数(请参阅更新的用法)。