我有这样的方法:
public List<Fruit> Traverse (IEnumerable<Fruit> collection, Action<Fruit> action)
我可以这样做:
Traverse (array, f => f.Text);
如何调用动作以获得相同的元素?
Traverse (array, f => f);
C#编译器不允许我这样做。
编辑:
List<Fruit> result = ...
foreach (Fruit fruit in collection)
{
result.Add(fruit);
action(fruit);
}
方法签名是固定的,所以我只能通过使用动作来获取其他任何东西,对吧?但我需要的是传递一个什么都不做的动作,这样我就得到了整个结果列表。
答案 0 :(得分:3)
Action不是一个什么都不返回的委托?怎么样:
Traverse(array, e => {});
答案 1 :(得分:1)
您的方法声明似乎不正确......
如果你有这个:
public List<string> Traverse (IEnumerable<string> collection, Action<string> action)
你不能传递这个:
Traverse (array, e => e.Text);
这将要求每个元素都支持“Text”属性。 String没有Text属性。
如果您通过IEnumerable<string>
,那么e => e
将评估为Func<string, string>
。你正在返回字符串。
如果你想要Action<string>
,你需要对不返回值(e)的字符串做一些事情。
答案 2 :(得分:1)
您已将Traverse方法设置错误。您需要在此处使用通用签名并返回Func<T>
。
public List<T> Traverse (IEnumerable<T> collection, Func<T,T> del)
答案 3 :(得分:1)
Action<string>
接受字符串参数但不返回任何内容,类似于签名为void Foo(string bar)
的方法。
如果您使用action参数填充返回值,则需要将操作替换为Func<string, string>
,后者采用字符串参数并返回字符串,类似于带有签名{{的函数1}}。