gpt4 book ai didi

c# - 参数类型 'void' 不可分配给参数类型 'System.Action'

转载 作者:可可西里 更新时间:2023-11-01 03:04:52 26 4
gpt4 key购买 nike

这是我的测试代码:

class PassingInActionStatement
{
static void Main(string[] args)
{
var dsufac = new DoSomethingUsefulForAChange();

dsufac.Do(WriteToConsole);
dsufac.Do2(s => WriteToConsoleWithSomethingExtra("Test"));
dsufac.Do(WriteToConsoleWithSomethingExtra("Test")); // Does not compile
}

internal static void WriteToConsole()
{
Console.WriteLine("Done");
}

internal static void WriteToConsoleWithSomethingExtra(String input)
{
Console.WriteLine(input);
}
}

internal class DoSomethingUsefulForAChange
{
internal void Do(Action action)
{
action();
}

internal void Do2(Action<String> action)
{
action("");
}
}

前 2 个调用有效,但我想知道为什么第 3 个调用无效。我不喜欢 Do2 中的代码,因为我在其中输入类型 action("") 以使其正常工作似乎很奇怪。

有人可以解释一下我不明白的两件事吗?

  1. 为什么我不能通过调用 Do 来写第三行
  2. 为什么我必须写 action("") 才能让它在 Do2 中工作

最佳答案

dsufac.Do(WriteToConsoleWithSomethingExtra("Test"));

实际上首先调用函数 ( WriteToConsoleWithSomethingExtra("Test") ) 然后尝试将结果传递给 Do .由于没有结果 ( void ),因此不可能。

你真正想要的是:

dsufac.Do(() => WriteToConsoleWithSomethingExtra("Test"));

内部声明一个不带任何参数的函数(() =>位),调用WriteToConsoleWithSomethingExtra("Test")执行时。 然后你的dsufac.Do调用将收到一个操作,就像它期望的那样。

至于Do2 - 你已经宣布它正在服用Action<String> ,这意味着 action是一个接受一个参数的函数。你必须给它传递一个字符串。该字符串可能为空,就像在您的 action("") 中一样例如,它也可能从外部传入,如下所示:

dsufac.Do3(WriteToConsole, "Test");

...

internal void Do3(Action<String> action, String str)
{
action(str);
}

关于c# - 参数类型 'void' 不可分配给参数类型 'System.Action',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3387812/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com