【问题标题】:Why does including a named argument cause a "type arguments for method cannot be inferred from usage" error? [duplicate]为什么包含命名参数会导致“无法从用法中推断出方法的类型参数”错误? [复制]
【发布时间】:2012-12-10 16:35:55
【问题描述】:

可能重复:
Named arguments and generic type inference in C# 4.0

如果您尝试编译此代码...

public interface IBar { }

public class StandardBar : IBar { }

public class Foo
{
    public TBar GetBarCore<TBar>(Func<TBar> getter)
        where TBar : IBar
    {
        return getter();
    }

    public StandardBar GetBar()
    {
        return GetBarCore(getter: Find);
    }

    public StandardBar Find()
    {
        return new StandardBar();
    }
}

...你会得到这个错误:

方法ConsoleApplication1.Foo.GetBarCore&lt;TBar&gt;(System.Func&lt;TBar&gt;) 的类型参数无法从用法中推断出来。尝试明确指定类型参数。

我花了一段时间才弄清楚 GetBarCore() 上的命名参数 (getter:) 是罪魁祸首。如果您删除参数名称,只留下GetBarCore(Find),则代码编译成功。不足为奇的是,如果如错误消息所示,显式指定类型参数(导致GetBarCore&lt;StandardBar&gt;(getter: Find)),您也可以成功编译代码。

(顺便说一句,这个小特性也让 ReSharper 绊倒了。我有一些运行良好的代码。我对代码文件做了一个非常小的更改并执行了“清理代码”操作,它删除了 R# 认为的“冗余”代码。嗯,它删除了我在使用命名参数的方法调用中看似不必要的显式类型参数之一,突然间,我的代码无法编译。)

谁能解释为什么提供命名参数会使编译器无法从用法中推断出类型参数?

【问题讨论】:

  • @PLB,你是对的,我的问题几乎是一样的。我不知道为什么我在搜索中没有遇到它。

标签: c# generics delegates resharper named-parameters


【解决方案1】:

Mono 的 C# 编译器(在 Mono 2.10.9 中使用 dmcs 测试)非常乐意推断类型,即使在使用命名参数时也是如此。我仍在尝试在标准中找到表明一种行为或另一种行为的内容,但我怀疑这只是 csc.exe 中的一个错误。

在 C# 5.0 中,csc.exe 似乎也可以正常工作。 (使用 LINQPad 4.43.06 测试。)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多