请告诉我出现了什么问题以及如何编写匿名方法并返回此实现
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;
}
答案 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表达式稍后在运行时解释