2015-11-19 3 views
-2

Почему оба метода не работают во время компиляции?Оператор вывода с IEnumerable <Lazy<T,T>>

Ошибка 1 Тело 'TestMethod (System.Collections.Generic.IEnumerable>)' не может быть итератор блока, потому что 'Core.Interfaces.IBusinessPluginMetadata' не итератор интерфейса типа ...

IBusinessPluginMetadata TestMethod(IEnumerable<Lazy<IBusinessPlugin, IBusinessPluginMetadata>> plugins) 
    { 
     foreach (Lazy<IBusinessPlugin, IBusinessPluginMetadata> plugin in plugins) 
     { 
      yield return (IBusinessPluginMetadata)plugin.Metadata; 
     } 
    } 

    IBusinessPluginMetadata TestMethod(IEnumerable<Lazy<IBusinessPlugin, IBusinessPluginMetadata>> plugins) 
    { 
      yield return plugins.Select(a => a.Metadata); 
    } 

<!-- language: c# --> 
public virtual ObservableCollection<IBusinessPluginMetadata> PluginsMetadata { get { } } 
<!--> 

Я бы литий ke, чтобы заполнить мое свойство ObservableCollection, используя get accessor с одним из этих методов.

+0

Вы можете использовать 'yield' только если вы возвращаете' IEnumerable ',' IEnumerable', 'IEnumerator ' или 'IEnumerator'. Из [документации] (https://msdn.microsoft.com/en-us/library/9k7k7cf0.aspx) – juharr

+0

Если 'Enumerable.Select' возвращает итератор, как вы ожидаете, что метод возвращает' IBusinessPluginMetadata'? –

+0

Также не должно быть необходимости бросать 'Метаданные', поскольку это уже тип' IBusinessPluginMetadata'. – juharr

ответ

0

После yield return вы должны указать один элемент и многократно называть это в методе, чтобы он возвращал несколько элементов. Метод должен возвращать IEnumerable<IBusinessPluginMetadata>.

В вашем первом случае измените тип возврата на IEnumerable<IBusinessPluginMetadata>, и вы хорошо пойдете.

В вашем втором случае Select уже возвращает итератор, просто верните это.