В коде существует только один тип, который реализует IResourceConverter. Вот что ищут два следующих выражения linq. Первый не находит. Последнее делает. Однако оба они эквивалентны синтаксисам (или, по крайней мере, должны быть!).linq головоломка ... эквивалентный синтаксис ... не эквивалентные результаты!
Linq Заявление 1:
List<Type> toInstantiate = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(assembly => assembly.GetTypes())
.Where(type => typeof(IResourceConverter).IsAssignableFrom(type)
&& type != typeof(IResourceConverter))
.ToList();
Это возвращает 0 результатов.
Linq Заявление 2:
Я оставил LINQ нетронутой для пункта где, который я разразившийся и сделал эквивалент с петлей Еогеаспа
List<Type> toInstantiate = new List<Type>();
List<Type> allTypes = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(assembly => assembly.GetTypes())
.ToList();
foreach (Type t in allTypes)
{
if (typeof(IResourceConverter).IsAssignableFrom(t)
&& t != typeof(IResourceConverter))
toInstantiate.Add(t);
}
В этом случае toInstantiate имеет 1 результат за исключением того, ... именно то, что я ожидал.
Любое объяснение этого странного поведения?
Я предполагаю, что 1 результат toInstantiate действительно реализует IResourceConverter? Возможно, вам захочется добавить/уточнить некоторые факты ... в настоящий момент контекст неоднозначен. – jrista
Извините, jrista. Да, существует один тип, который реализует IResourceConverter. Это то, что ищут выражения linq. Первый не находит. Последнее делает. Однако оба они кажутся эквивалентными синтаксисами. – Daniel
Я заметил, что это также происходит, если вы все еще используете linq, но держите его отдельно и запрашиваете его из allTypes. –