Странная ошибка времени компиляции в методах LINQ Select () и ToList () - PullRequest
1 голос
/ 21 декабря 2011

У меня есть несколько простых строк кода в проекте 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: An error is in the list.

UPD2: ОТВЕТ

Я и мой коллега исследовали проект и выяснили, что причина проблемы.Вот несколько фактов о нашем решении для Visual Studio:

  1. Проблемный код находится в проекте под названием Flyer2.Этот проект имеет ссылку на другой проект под названием Global.
  2. В проекте Global есть несколько классов, которые предоставляют глобальные доступные методы расширения.
  3. Один из методов расширения имеет ограничение для универсального типа, в которомпункт.Ограничение говорит, что универсальный тип должен быть потомком 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;
        }
    }
}
...