Подробнее см. ниже:
У меня есть такой код:
void Test(IEnumerable x)
{
var dynX = x.Cast<dynamic>();
var result = dynX.Select(_ => _.Text);
}
в существующем проекте библиотеки, ориентированном на .NET 4.5. VS2015s IntelliSense подчеркивает часть Text
, жалуясь, что: "object" не содержит определения для "Text"...
Конечно, компиляция завершилась неудачей с
ошибка CS1061: "объект" не содержит определения для "Текст" и не может быть найден метод расширения "Текст", принимающий первый аргумент типа "объект" (вам не хватает директивы using или ссылки на сборку?)
Это сообщение всегда говорит 'object'
, даже когда я меняю приведение на .Cast<IAsyncResult>()
или еще что-то. Когда я нахожу параметр лямбда, всплывающая подсказка показывает его тип IColumn
(который существует, но не имеет отношения). Опять же, какой бы тип я ни выбрал.
Однако, когда я нахожу метод Select()
, он правильно показывает параметр как Func<dynamic, dynamic>
. Если я задаю тип параметра лямбда явно, он компилируется. Если я укажу параметры типа на Select()
явно, это тоже работает.
Другие действия LINQ с dynamic
работают. Когда я копирую этот метод в другой (существующий) проект в решении, он также компилируется. Когда я копирую его в другой файл в том же проекте, он не компилируется.
Он также компилируется с VS2013.
Сама же ошибка появляется и для всех моих коллег, как в Windows 8.1, так и в Windows 10.
Возможно, это какая-то странная проблема с типом вывода...?
Вещи Ive пробовали, что не помогли:
- Создайте новый проект библиотеки .NET 4.5 и снова добавьте файлы и отсутствующие ссылки
- Сравнить (оригинальные) файлы проекта - никаких различий, кроме упорядочения элементов
Обновление
Ну, мне удалось создать автономный минимальный неудачный пример:
static class Program
{
static void Main(string[] args)
{
IEnumerable x = new object[0];
IEnumerable<dynamic> dynX = x.Cast<dynamic>();
// CS1061 'object' does not contain a definition for 'Text'...
// var tooltip shows IColumn instead of IEnumerable<dynamic>
var result = dynX.Select(_ => _.Text);
}
public static IColumn Select<TResult>(this IColumn source, Func<object, TResult> selector)
{
throw new NotImplementedException();
}
}
public interface IColumn { }
Из того, как я это вижу, это явно указывает на серьезную ошибку в том, как VS2015/новая версия компилятора разрешает методы расширения.
Ниже приведено только слабое отношение и в основном относится к вводящим в заблуждение сообщениям об ошибках. Я решил оставить его, чтобы не комментировать ошибки.
Хуже того, они также терпят неудачу с той же ошибкой, хотя ни один IEnumerable
и object
не может иметь метод расширения Select()
:
// CS1061 'object' does not contain a definition for 'Text'
// var tooltip shows IColumn
var result2 = x.Select(_ => _.Text);
object o = new object();
// CS1061 'object' does not contain a definition for 'Text'
// var tooltip shows IColumn
var result3 = o.Select(_ => _.Text);
Добавление
Эта проблема теперь отслеживается в отслеживании ошибок Roslyn.