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

Cle*_*ton 33 .net c# 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);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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)*'
Run Code Online (Sandbox Code Playgroud)

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

Meh*_*ari 47

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

更新:

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