我试图通过尝试不同的事情来围绕Csharp中的不同概念。创建一个接受动作的通用函数。该操作有一个输入参数并返回void。我创建了一个链接到lambda函数的简单动作(返回void有一个参数x)。我能够运行该操作但是当我将该函数传递给我的泛型函数时,我不确定如何添加输入参数。 act(“Some Int”)不起作用。
如何将值传递给某个操作?
public MainWindow()
{
InitializeComponent();
Action<int> myAction = (x) => Console.WriteLine(x);
myAction(13);
test(myAction);
}
private static void test<T>(Action<T> act)
{
act(); // How do i pass in an int Here?
}
答案 0 :(得分:4)
只需调用act("Some Int")
,因为您刚要求Action
行为是一个genric函数。因此,您无法使用一个固定变量类型专门调用它。您可以通过修改test
- 方法
private static void test<T>(Action<T> act, T value)
{
act(value); // How do i pass in an int Here?
}
...
test(myAction,integerValue);
现在,您可以使用给定的Action
值来调用int
。
答案 1 :(得分:1)
我可以看到你正在尝试做什么,只是想抛出这个模式,因为我们经常在必须使用闭包时执行此操作,并且参数可能会大不相同。
在这些情况下,您可以简单地将方法定义为Action<T>
,而不是将Action
定义为能够使用闭包的哪种方式。所以test
看起来像这样:
private static void test(Action act)
{
act(); // yup, that's all there is to it!
}
那么你将如何传递参数?简单:使用闭包。像这样:
public MainWindow()
{
InitializeComponent();
var x = 13; // this defined outside now...
Action myAction = () => Console.WriteLine(x); // you're basically using the closure here.
myAction();
test(myAction);
}
当我们进行上下文切换(也称为线程跳转)时,我们经常使用这种方法,并且需要线程延续在其执行的点处拾取一个或多个变量值。这只是一个例子,还有其他一些有效的用例。
您的实验示例,如果我正确地阅读它,也可能有资格作为封闭可能适合的情况。