#c#
#c#
Вопрос:
В моем проекте есть следующие методы расширения:
public static void AddToDataTable<T>(this T instance, DataTable table) where T : IDatabaseObject
{
DataRow row = table.NewRow();
instance.PopulateRow(row);
table.Rows.Add(row);
//return row;
}
public static void AddToDataTable<T>(this ICollection<T> instances, DataTable table) where T : IDatabaseObject
{
foreach (var instance in instances)
instance.AddToDataTable(table);
}
Затем я вызываю эти функции в разных местах следующим образом:
// Article is just a single item
articlePublishingInfo.Article.AddToDataTable(articleTable);
А также вот так:
List<ArticlePagesDBO> articlePages = BuildAdditionalPageRelations(pagePublishing, articlePageInfo, pageData);
articlePages.AddToDataTable(dt);
Все это отлично работает при локальной компиляции, но сервер сборки выдает ошибку компиляции со словами
Тип ‘System.Коллекции.Generic.ListDataObjects.CM.ArticlePagesDBO>’ не может использоваться в качестве параметра типа ‘T’ в общем типе или методе ‘DatabaseObjectExtensions.AddToDataTable(T, DataTable)’. Нет неявного преобразования ссылок из ‘System.Коллекции.Generic.ListDataObjects.CM.ArticlePagesDBO>’ to ‘Vitec.Core.Web.Utilities.Data.IDatabaseObject’.
И это похоже.. да, это кажется правильным, a List<T>
— это не то же самое, что T
. Но почему сервер сборки не находит перегруженную версию метода расширения? Есть идеи? Метод расширения определен в двоичном файле, отличном от того, где находятся вызовы, и пространства имен обоих типов в сообщении об ошибке указаны правильно.
Если я переименую второй метод во что-то другое, например AddAllToDataTable , тогда это сработает. Но я как бы хочу знать, почему происходит сбой при перегрузке и что может быть причиной этого. Первоначально сервер сборки создавал проект с использованием VS2015, но изменение его на то же, что и в моей локальной среде, VS2019 не помогло.
Комментарии:
1. Probalby
IDatabaseObject
определен в другом двоичном файле, и они конфликтуют.2. Другого интерфейса с таким именем нет ни в одном другом проекте в решении, ни в какой-либо из зависимостей, по крайней мере, в тех, которые мы разрабатываем.
3. Ваш метод определен в другом двоичном коде. Вот и все. Контрольная сумма, которую вы запускаете локально, и удаленный, бьюсь об заклад, вы получите разные хэши.
4. Как мне это сделать во время компиляции, поскольку это ошибка компиляции?
5. Возьмите двоичный файл, физическую * dll и вычислите его контрольную сумму. Тот, который вы получили локально, вероятно, даст хэш, отличный от того, который вы получите в удаленном двоичном файле, который заканчивается исключением.
Ответ №1:
Я вернулся к журналам и понял, что, хотя задание сборки на сервере было настроено на запуск Visual Studio 2019, на самом деле оно не было установлено на сервере, и сборка вернулась к Visual Studio 2015 с предупреждением.
После установки VS2019 на сервере сборка завершается, поэтому я предполагаю, что это была проблема с версией C #, возможно, перегрузка методов расширения в том виде, в котором я это делал, была несовместима с VS2015.