У меня есть несколько простых строк кода в проекте WPF, которые дают мне ошибки компиляции.
var resourceNames = new List<string> { "cmbItem1", "cmbItem2", "cmbItem3", "cmbItem4" };
var comboBoxItems = resourceNames.Select(id => (string)FindResource(id)).ToList();
// other code
Текст ошибки компиляции:
Ошибка 2 Тип «System.Windows.Forms.Control» определен в сборке, на которую нет ссылок.Необходимо добавить ссылку на сборку 'System.Windows.Forms, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089'.
Почему я ссылаюсь на эту сборку?Я не использую какой-либо тип из System.Windows.Forms.Control!
Если я переписываю код для вызова статических методов вместо вызовов методов расширения, он отлично работает:
var resourceNames = new List<string> { "cmbItem1", "cmbItem2", "cmbItem3", "cmbItem4" };
var comboBoxItems = Enumerable.Select(resourceNames, id => (string)FindResource(id));
comboBoxItems = Enumerable.ToList(comboBoxItems);
// other code
Почему это так?Что я делаю не так?
UPD1:
UPD2: ОТВЕТ
Я и мой коллега исследовали проект и выяснили, что причина проблемы.Вот несколько фактов о нашем решении для Visual Studio:
- Проблемный код находится в проекте под названием Flyer2.Этот проект имеет ссылку на другой проект под названием Global.
- В проекте Global есть несколько классов, которые предоставляют глобальные доступные методы расширения.
- Один из методов расширения имеет ограничение для универсального типа, в которомпункт.Ограничение говорит, что универсальный тип должен быть потомком System.Windows.Control ... По какой-то причине существование такого метода приводит к ошибке времени компиляции, которую я описал ...
Вот код метода расширения и определяющий его класс:
using System.Windows.Forms;
namespace Global
{
public static class ControlExtensions
{
// If I remove the where-clause, the code problem disappears!
public static T FindParentByType<T>(this Control parentControl) where T : Control
{
var currentControl = parentControl != null ? parentControl.Parent : null;
while (currentControl != null)
{
if (currentControl is T)
return (T)currentControl;
currentControl = currentControl.Parent;
}
return null;
}
}
}