2015-11-09 6 views
3

Работа в проекте C# WebApp, который я унаследовал. У меня есть пара определений функций, как так ...C# Функция жалобы с компилятором неоднозначна сама по себе

public static DataTable ExecuteDT(this AppDBContext target, string sql, int timeoutSeconds = defaultTimeoutSeconds) { 
    DbCommand cmd = target.Database.Connection.CreateCommand(); 
    cmd.CommandText = sql; 
    cmd.CommandType = System.Data.CommandType.Text; 
    if (timeoutSeconds != defaultTimeoutSeconds) cmd.CommandTimeout = timeoutSeconds; 

    DataTable rv = new DataTable(); 
    rv.Load(cmd.ExecuteReader()); 
    return rv.Copy(); 
} 

public static object ExecuteDR(this AppDBContext target, string sql, int timeoutSeconds = defaultTimeoutSeconds) { 
    DataTable dt = target.ExecuteDT(sql, timeoutSeconds); 
    return (ReferenceEquals(dt, null) || dt.Rows.Count == 0) ? null : dt.Rows[0]; 
} 

Когда я делаю Построить по применению, он компилирует нормально с нулевыми ошибками.
Однако, когда я пытаюсь запустить сайт (с помощью F5), он запускает в своем браузере, а затем приходит с ошибкой компиляции:

Compiler Error Message: CS0121: The call is ambiguous between the following methods or properties: 
'ConstructionLoan.WebFormsApp.DataExtensions.ExecuteDT(ConstructionLoan.Domain.Data.AppDBContext, string, int)' and 
'ConstructionLoan.WebFormsApp.DataExtensions.ExecuteDT(ConstructionLoan.Domain.Data.AppDBContext, string, int)' 

Source Error: 

Line 34: 
Line 35:   public static object ExecuteDR(this AppDBContext target, string sql, int timeoutSeconds = defaultTimeoutSeconds) { 
Line 36:    DataTable dt = target.ExecuteDT(sql, timeoutSeconds); 
Line 37:    return (ReferenceEquals(dt, null) || dt.Rows.Count == 0) ? null : dt.Rows[0]; 
Line 38:   } 


Source File: c:\Users\myuser\Source\Workspaces\ourclient\src\Web\Main\ConstructionLoan.WebFormsApp\App_Code\DataExtensions.cs Line: 36 

Он жалуется на то же точной функции двусмысленность с собой , Я выполнил поиск по всему исходному коду, и это одно и только объявление этой функции, поэтому я действительно почесываю голову о том, что компилятор запутался.

Единственный вопрос, который я нашел в Google, который был похож на этот, был тем, кто каким-то образом каким-то образом связался с самим собой. Я дважды проверял, чтобы этот проект не ссылался на себя, а это не так.

Я также пробовал сделать Чистоту и Восстановить проект.

По какой-то причине этот проект компилируется в среде IDE, но при попытке запустить его в браузере он держится.

Я работаю в VS 2015 и нацелен на версию Framework версии 4.5.2.

+3

Вы пытались удалить содержимое «Временных файлов ASP.NET»? Иногда предыдущая версия DLL застревает там, и она мешает более новому набору двоичных файлов, когда компилятор делает свою магию. – xxbbcc

+0

FYI: исходные файлы в [App_Code скомпилированы ASP.NET во время выполнения] (https://msdn.microsoft.com/en-us/library/vstudio/t990ks23 (v = vs.100) .aspx). «Вы можете хранить исходный код в папке App_Code, и он будет автоматически скомпилирован во время выполнения». Вы можете предварительно скомпилировать их, используя [Инструмент компиляции ASP.NET] (https://msdn.microsoft.com/en-us/library/ms229863.aspx). – KiwiPiet

+0

У вас есть две копии DLL, присутствующих на сервере? Он может находить ту же функцию в двух отдельных dll. – JosephStyons

ответ

0

Видимо, это связано с папкой App_Code.

Казалось бы, что-нибудь в папке App_Code получает как скомпилированные в DLL, так и оставленные там и скомпилированные во время выполнения. Таким образом, во время выполнения были загружены две копии класса, загружаемого в одно и то же пространство имен, и, следовательно, ошибка.

Я переместил все файлы, которые были в App_Code, в новую специальную папку, отличную от ASP.NET, и теперь эта ошибка исчезла.

Смежные вопросы