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
时不需要泛型类型参数(请参阅更新的用法)。