3

可能重复:
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<TBar>(System.Func<TBar>)无法从用法中推断出方法的类型参数。尝试明确指定类型参数。

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

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

有人可以解释为什么提供命名参数会使编译器无法从使用中推断出类型参数吗?

4

1 回答 1

2

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

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

于 2012-12-24T07:22:27.717 回答