以下方法或属性之间的调用是不明确的(bug ??)

时间:2009-08-15 19:30:10

标签: c# .net asp.net-mvc .net-3.5

  1. 创建一个新的ASP.NET MVC Web 申请
  2. 创建ASP.NET App_Code  夹
  3. 新的内部 文件夹,用一个创建一个类 扩展方法。例如:

    static public class BugMVCExtension
    {
        public static int ToInt(this string str)
        {
            return Convert.ToInt32(str);
        }
    }
    
  4. 选择一个视图并尝试使用此新的扩展方法

  5. 你会得到这个例外:

    CS0121: The call is ambiguous between the following methods or properties:
    '*MvcApplication1.App_code.BugMVCExtentions.ToInt(string)*' and
    '*MvcApplication1.App_code.BugMVCExtentions.ToInt(string)*'
    

    这里的任何人都有更多相关信息吗? 在ASP.NET MVC(?)Web应用程序中创建App_code是错误的吗?

4 个答案:

答案 0 :(得分:46)

在Visual Studio中创建的MVC项目默认使用Web应用程序项目模型。 App_Code主要由网站模型使用。我建议阅读它们之间的差异(another question covers this,它也在MSDN上广泛讨论)。如果在Web应用程序项目中将源文件添加到App_Code,Visual Studio会将其编译为DLL(因为它包含在项目中)并将其放入/bin。在运行时,ASP.NET编译器会看到App_Code并尝试在不同的程序集中编译源代码。因此,两个不同的程序集中将存在两个具有相同名称的单独类,当ASP.NET解析器尝试编译.aspx文件时,它将无法选择一个。

更新

这两个(扩展方法和您要实例化的类)是否在一个.cs文件中?否则,您实例化的类可能位于源文件中,构建操作(右键单击文件,单击属性)设置为内容,告诉Visual Studio跳过它在构建过程中(在这种情况下,您将无法在App_Code之外的其他.cs文件中引用它,但您将能够在视图中使用它,因为它只会来在运行时生活。)如果构建操作是编译,您将收到错误。问题绝对不是扩展方法所特有的。对于添加到App_Code的源文件,Visual Studio似乎足够聪明,可以将其设置为Content。

答案 1 :(得分:2)

我通过将.cs文件放在Web应用程序的根目录中的App_Code文件夹之外来解决了这个问题。

答案 2 :(得分:2)

请勿使用app_code文件夹。

使用任何其他文件夹名称。 IE浏览器。 appCode或ApplicationsCode。

文件夹中的名称意味着在运行时进行一些编译,导致代码重复。

答案 3 :(得分:1)

我通过放置文件夹的完整命名空间的扩展名文件来解决。

命名空间助手 {

命名空间xxx.yyy.zzz.Helpers {