单一方法即扩展方法之间的调用是模糊的

时间:2013-06-24 19:00:55

标签: c# asp.net runtime-error ambiguous

我有一个像

这样的扩展方法
public static class Extension
{
    public static string GetTLD(this string str)
    {
        var host = new System.Uri(str).Host;
        int index = host.LastIndexOf('.'), last = 3;
        while (index >= last - 3)
        {
            last = index;
            index = host.LastIndexOf('.', last - 1);
        }
        var domain = host.Substring(index + 1);
        return domain;
    }
}

我称之为

string domain = "." + _url.GetTLD();

我在构建和清理构建时没有遇到任何错误 但是我在运行时错误地说compilation error

  

以下方法或属性之间的调用不明确:   'myignOU.Extension.GetTLD(string)'和   'myIGNOU.Extension.GetTLD(字符串)'

我发誓我没有把这个扩展方法放在项目的任何其他地方。 为什么我只在运行时收到此错误..?

但是,如果我删除此方法,那么我在构建时遇到错误,而不是在运行时。没有这种方法的代码,一切正常。

Here is compilation error page

6 个答案:

答案 0 :(得分:65)

我有同样的问题,但对我来说,它解决了从项目引用中删除自己的项目的问题。 Resharper意外地添加了对同一项目的编译二进制文件的引用。这样我在我的项目中有2次相同的扩展类。在构建期间,它无法区分扩展类的源版本或二进制版本。

基本上:检查项目引用是否包含对自身的引用。

@shashwat提供的答案也是一个案例。

答案 1 :(得分:12)

这不是一个真正的解决方案,我无法解释它是如何工作的,但它有效。

我正在尝试Project Properties,References,bin,obj中的所有内容,但实际上没有任何帮助。我只是尝试了每个选项,并从上下文菜单中选择了“转换为Web应用程序”。虽然它之前是Web应用程序。它向我显示一条警告,说.designer.cs个文件将被添加到每个aspx文件中,我只需单击OK即可。

App_Code文件夹(其中所有这些类都已重命名)重命名为Old App_Code之外,所有内容都保持不变,我将构建项目。现在我在运行时没有收到编译错误。

我知道App_Code文件夹是针对网站项目的,直到这次WAP才对此我没有任何问题。但我只是意识到我不应该在WAP中使用App_Code文件夹,因为这里讨论的是wrox forum (1st point)。作者在这里说过

  

WAP不支持App_Code。 App_Code文件夹编译在   运行时; WAP中的所有代码都是在编译/开发时编译的。因此,当您向WAP添加App_Code文件夹时。你结束了   重复代码;例如,App_Code中定义的类也将   显示在wap DLL中。修复很简单:只需命名文件夹即可   其他类似于Classes或CodeFiles。

我在转换之前尝试过重命名,但那次它没有用。

答案 2 :(得分:2)

我遇到了同样的问题。经过一些研究和实验,我发现(无论出于何种原因)visual studio不喜欢App_Code文件夹中的扩展方法。我发现最简单的解决方案就是更改文件夹的名称。

答案 3 :(得分:1)

我有同样的情况。我有一个自定义网格控件,有一个扩展方法。该方法仅在一个地方声明。该控件已在我的解决方案中的多个位置使用,没有任何问题。然后有一天,我复制了一个控件,通过在同一个项目中逐字复制和粘贴来实现自定义网格控件。然后我只是适当地重命名了属性。之后解决方案不会构建引用与上面相同的错误。我怀疑复制和粘贴是否为项目添加了对自身的引用。

删除它解决了问题。

答案 4 :(得分:0)

我的问题类似于shashwat所描述的。在我的情况下,我将代码文件放在App_Code目录中,但为了获得intellisense,我将文件本身设置为compile,这可能意味着文件在运行时和编译时都被编译。我刚把文件移出App_Code。

答案 5 :(得分:0)

我在上面的评论中找到了这个解决方案。 它帮助了我。

我在项目A中引用了项目A. 错误的。

删除帮助=)