Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 3.0 使扩展方法通用_C# 3.0 - Fatal编程技术网

C# 3.0 使扩展方法通用

C# 3.0 使扩展方法通用,c#-3.0,C# 3.0,这里有一种非常有趣的方法,可以使用静态扩展方法更新UI线程 public static void InvokeIfRequired(this Control c, Action<Control> action) { if(c.InvokeRequired) { c.Invoke(() => action(c)); } else { action(c); } } 我尝试了以下方法: public

这里有一种非常有趣的方法,可以使用静态扩展方法更新UI线程

public static void InvokeIfRequired(this Control c, Action<Control> action)
{
    if(c.InvokeRequired)
    {
        c.Invoke(() => action(c));
    }
    else
    {
        action(c);
    }
}
我尝试了以下方法:

  public static void InvokeIfRequired<T>(this T c, Action<T> action) where T : Control
    {
        if (c.InvokeRequired)
        {
            c.Invoke(() => action(c));
        }
        else
        {
            action(c);
        }
    }
publicstaticvoid invokeifrequered(这个tc,Action-Action),其中T:Control
{
如果(c.invokererequired)
{
c、 调用(()=>动作(c));
}
其他的
{
行动(c);
}
}
但我得到了以下错误,我不知道如何修复。有什么建议吗

错误5无法将lambda表达式转换为类型“System.Delegate”,因为它不是委托类型


这是lambdas和匿名方法的一个众所周知的错误:

您的代码只需要转换即可编译:

public static void InvokeIfRequired<T>(this T c, Action<T> action) where T : Control
{
    if (c.InvokeRequired)
    {
        c.Invoke((Action<T>)((control) => action(control)));
    }
    else
    {
        action(c);
    }
}
publicstaticvoid invokeifrequered(这个tc,Action-Action),其中T:Control
{
如果(c.invokererequired)
{
c、 调用((操作)((控制)=>操作(控制));
}
其他的
{
行动(c);
}
}

这是lambdas和匿名方法的一个众所周知的错误:

您的代码只需要转换即可编译:

public static void InvokeIfRequired<T>(this T c, Action<T> action) where T : Control
{
    if (c.InvokeRequired)
    {
        c.Invoke((Action<T>)((control) => action(control)));
    }
    else
    {
        action(c);
    }
}
publicstaticvoid invokeifrequered(这个tc,Action-Action),其中T:Control
{
如果(c.invokererequired)
{
c、 调用((操作)((控制)=>操作(控制));
}
其他的
{
行动(c);
}
}

试试这个小小的变化:

public static void InvokeIfRequired<T>(this T c, Action<T> action) where T : Control
{
    if (c.InvokeRequired)
    {
        c.Invoke((Action<T>)(() => action(c)));
    }
    else
    {
        action(c);
    }
}
publicstaticvoid invokeifrequered(这个tc,Action-Action),其中T:Control
{
如果(c.invokererequired)
{
c、 调用((动作)(()=>动作(c));
}
其他的
{
行动(c);
}
}

您需要将其强制转换为委托类型。我知道有点傻。我不能给你一个很好的理由来解释为什么lambda表达式不能作为委托隐式赋值

试试这个小小的变化:

public static void InvokeIfRequired<T>(this T c, Action<T> action) where T : Control
{
    if (c.InvokeRequired)
    {
        c.Invoke((Action<T>)(() => action(c)));
    }
    else
    {
        action(c);
    }
}
publicstaticvoid invokeifrequered(这个tc,Action-Action),其中T:Control
{
如果(c.invokererequired)
{
c、 调用((动作)(()=>动作(c));
}
其他的
{
行动(c);
}
}
您需要将其强制转换为委托类型。我知道有点傻。我不能给你一个很好的理由来解释为什么lambda表达式不能作为委托隐式赋值

替换:

c.Invoke(() => action(c));
与:

c.Invoke(action, c);
替换:

c.Invoke(() => action(c));
与:

c.Invoke(action, c);

事实上再仔细看一下,我似乎也发现了第一个代码示例中的错误。。。虽然我现在正在编译.NET4.0。事实上。。。再仔细看一下,我似乎也发现了第一个代码示例中的错误。。。尽管我目前实际上正在为.NET 4.0进行编译,但它不会工作,因为
action
接受一个参数,而您不会将其传递给
Invoke
good point。编辑以说明这一点。出于某种原因,我认为调用是在当前控件中传递的,但事实并非如此。它不会起作用,因为
action
接受一个参数,而您不会将其传递给
Invoke
good point。编辑以说明这一点。出于某种原因,我认为调用是在当前控件中传递的,但事实并非如此。它也不起作用。您需要向
Invoke
方法提供操作的参数,但该方法也不起作用。您需要向
Invoke
方法提供操作的参数