【问题标题】:The type arguments for method cannot be inferred from the usage. (c#, lambda)无法从用法中推断出方法的类型参数。 (c#, 拉姆达)
【发布时间】:2014-01-17 19:15:20
【问题描述】:

首先,我是高级编程的初学者。我所做的只是在网上找到的 C++ 教程。我在工作中面临这个问题。我见过类似的查询,但没有任何帮助我理解。

请注意:我不擅长方法、对象、接口等术语。所以我可能在更远的地方犯了错误。我正在慢慢学习。

代码块 1:

public static class DummyClassName
{
    public static T DummyTemplateFunc<T>(DummyInterfaceName aaa1, Func<T> action)
    {
        T DummyVal = action();
        // blah blah code
        // blah blah code

        return val;
    }
}

代码块 2:

public class ClassName2 : blah1 , blah2, blah3
{
    public void Method1(string DummyString)
     {
         DummyClassName.DummyTemplateFunc(_aaa1, ()=>Function1(_arg1, arg2));
     }
}

我会尽我所能解释发生了什么。第二段代码在程序中反复使用,用不同的函数(或方法?)代替 Function1。 (这些函数来自与这个链接的一个C++程序。我不知道如何)

如果这些函数是任何返回类型,除了 void,程序运行良好。

如果使用了 void-return-type 函数,我会得到错误

"The type arguments for method '****.****.DummyClassName.DummyTemplateName<T>
(****.****.DummyInterfaceName, System.Func<T>)' cannot be inferred from the usage. 
Try specifying the type arguments explicitly.' 

据我了解,这是因为当传递一个 void 函数时,它会在第一个代码块中取代 T 并尝试返回“val”。这就是引发错误的原因。

有人可以帮我找到解决方法吗?我不介意专门定义一个完全不同的类/方法来处理 void 函数。我知道哪些函数的返回类型为 void。

【问题讨论】:

  • 提供Action 重载。
  • 你说得对,这令人困惑。问题在于void 是一个非常特殊的类型。简单地说:在推断T 时,您必须推断出可以转换为object 的类型。但是void不能转换成object,因为void是一个对象的absense

标签: c# lambda void


【解决方案1】:

创建另一个重载,使用Action 而不是Func&lt;T&gt;

public static class DummyClassName
{
    public static void DummyTemplateFunc(DummyInterfaceName aaa1, Action action)
    {
        // you cannot assign result to variable, because it returns void
        action();

        // I also changed method to return void, so you can't return anything
        // return something;

        // ofc you can make it return something instead
    }
}

【讨论】:

  • 没错。 FuncAction 都是委托,所以它们都持有对函数的引用。但是,Func 代表返回值,Action 代表返回 void。
  • @MarcinJuraszek 我感激不尽。这非常有效。
  • @ChrisHardie Delegates 对我来说是一个非常新的概念。我正在阅读它。你的评论有助于简化我的想法。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-09
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多