На самом деле это не ответ, но он может предоставить другим более простой способ воспроизвести проблему (из командной строки - вы можете сделать это с двумя проектами в Visual Studio, если хотите).
1) Создайте BadLinq.cs и создайте его как BadLinq.dll:
using System.Collections.Generic;
namespace System.Linq
{
public static class Enumerable
{
public static IEnumerable<T> Where<T>(this IEnumerable<T> source,
Func<T,bool> predicate)
{
return null;
}
}
}
2) Создать Test.cs:
extern alias SystemCore;
using System;
using SystemCore::System.Linq;
static class Test
{
static void Main()
{
var names = new[] { "Larry", "Curly", "Moe" };
var result = names.Where(x => x.Length > 1);
}
}
3) Скомпилируйте Test.cs, указав внешний псевдоним:
csc Test.cs /r:BadLinq.dll /r:SystemCore=System.Core.dll
Это не с:
Test.cs (11,28): ошибка CS1061:
'System.Array' не содержит
определение для «где» и нет
метод расширения «Где», принимающий первый аргумент типа
'System.Array' может быть найден
(вам не хватает директивы using или ссылки на сборку?)
Если вы измените его, чтобы не пытаться использовать метод расширения (т.е. Enumerable.Where), он отлично работает с внешним псевдонимом.
Я думаю, что может быть ошибкой компилятора. Я отправил по электронной почте частный список рассылки, который читает команда C # - я обновлю этот ответ или добавлю новый, когда получу ответ.