【问题标题】:The call is ambiguous between the following methods or properties (bug??)以下方法或属性之间的调用不明确(错误??)
【发布时间】:2010-11-19 22:30:51
【问题描述】:
  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. 选择一个视图并尝试使用这个新的扩展方法

你会得到这个异常:

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 是否错误?

【问题讨论】:

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


    【解决方案1】:

    在 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 文件中?否则,您要实例化的类可能位于源文件中,其中 Build Action(右键单击文件,单击属性)设置为 Content,这会告诉 Visual Studio 跳过它在构建过程中(在这种情况下,您将无法在 App_Code 之外的其他 .cs 文件中引用它,但您将能够在视图中使用它,因为它只会变得生动在运行时。)如果构建操作是Compile,你会得到一个错误。这个问题绝对不是特定于扩展方法的。 Visual Studio 似乎足够聪明,可以将添加到 App_Code 的源文件默认设置为 Content。

    【讨论】:

    • 但是为什么只有当我尝试在视图中使用扩展方法时才会出现这个问题?例如,如果我尝试在 Controller 中使用相同的 EM,则运行不会出现问题。
    • 因为Controller也是在构建时由VS编译器编译的。那时,该类只有一个实例。 App_Code运行时编译。
    • Mehrdad,我理解,但如果它发生了,我应该得到这个编译器异常“甚至”我不使用扩展方法吗?做另一个测试,在 App_code 中创建一个实例类,尝试在另一个视图中使用它......它会毫无问题地工作。我不明白为什么这只发生在扩展方法上。
    • 不,只有在使用扩展方法时才能得到。如果你不这样做,就会有两种不同的方法在不同的程序集中快乐地生活。除非有人叫它,否则你永远无法选择一个。你能描述第二种情况吗(创建实例......我不明白)
    • 对不起我的英语不好:) 在我开始得到这个编译器异常之前,我使用了一些在 app_code 中创建的类没有问题,那是因为我觉得这很奇怪,因为它只发生在提取方法。
    【解决方案2】:

    不要使用 app_code 文件夹。

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

    文件夹中的名称暗示在运行时进行的某些编译会导致代码重复。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        命名空间助手 {

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-08
          • 2012-02-09
          • 2020-01-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多