带有return的匿名方法

时间:2014-12-28 23:07:20

标签: c# lambda

请告诉我出现了什么问题以及如何编写匿名方法并返回此实现

public class Test 
{
    public string Implisity { get; set; }

}

class Program
{
    static void Main(string[] args)
    {
        /*Here is a problem */
        var variable = Method(delegate(IList<string> i, List<string> j){ return new Test(){Implisity = i[j.IndexOf("Implisity")]}; });
    }

    public static List<T> Method<T>(Func<IList<string>, IList<string>, T> staff) { return new List<T>(){staff(new List<string>() {"1","2"}, new List<string>(){"Explisity","Implisity"})}; }
}

这是一个扁平的方法,因为我需要匿名

    public static Test Annonymous(IList<string> i, List<string> j) 
    { 
        var obj = new Test() { Implisity = i[j.IndexOf("Implisity")] };
        return obj;
    }

2 个答案:

答案 0 :(得分:4)

问题是Method(...)方法期望Func<...>具有不同的参数类型:它期望一个方法需要两个IList<string>个对象,而你创建一个带有{的委托{1}}和IList<string>

List<string>

为避免将来出现此类问题,请使用隐式类型,如下所示:

var variable = Method(
    delegate(IList<string> i, IList<string> j) {
    //                        ^
        return new Test() {
            Implisity = i[j.IndexOf("Implisity")]
         };
    }
);

在此示例中,编译器从var variable = Method( (i, j) => new Test { Implisity = i[j.IndexOf("Implisity")] } ); 方法的签名中知道函数的参数类型必须是什么,因此它隐式地将类型分配给Method(...)i

答案 1 :(得分:2)

试试这个:

 var variable = Method((i, j) => new Test() { Implisity = i[j.IndexOf("Implisity")] });

lambda expression是一个代替委托实例编写的未命名方法。 编译器立即将lambda表达式转换为:

  • 委托实例。
  • 表达式Expression<TDelegate>的表达式树,表示 可遍历对象模型中lambda表达式内的代码。这个 允许lambda表达式稍后在运行时解释