【问题标题】:Why can't I use "yield" operator to return a lazy list in IValueConverter?为什么我不能使用“yield”运算符在 IValueConverter 中返回惰性列表?
【发布时间】:2013-05-13 17:17:38
【问题描述】:

假设我有以下课程:

public class Values {
    public string Value1 {get;set;}
    public string Value2 {get;set;}
    public string Value3 {get;set;}
}

现在我想使用 IValueConverter 以特定顺序将此对象的值绑定到 GUI 组件的 ItemsSource:

public class ValuesToListConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var valuesObj = (Values ) value;
        yield return valuesObj.Value1;
        yield return valuesObj.Value3;
        yield return valuesObj.Value2;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

但是当我这样做时,我收到以下错误:

'Convert' 的主体不能是迭代器块,因为'object' 不是迭代器接口类型。

有没有办法在 IValueConverter 中懒惰地创建这个列表?还是我必须这样做:

return new List<string> { valuesObj.Value1, valuesObj.Value3, valuesObj.Value2 }

【问题讨论】:

  • yield 语句只能出现在返回 IEnumerableIEnumerator 的方法中。您可以创建一个惰性私有方法,然后从Convert 返回其结果,但调用者不太可能知道如何处理返回值。我只会返回List
  • 感谢@dlev 添加私有方法有效。

标签: c# silverlight


【解决方案1】:

迭代器块仅在返回类型为以下之一时定义:

  • IEnumerable
  • IEnumerable-of-T
  • IEnumerator
  • IEnumerator-of-T

然后生成的迭代器成为一个状态机,它履行一个非常具体的合同,提供延迟执行和多个值的惰性迭代。

如果返回对象,这些都不适用:您需要返回一个对象现在

如果您的转换器需要返回一个 IEnumerable,那么您可以这样做 - 但您需要为迭代器块添加第二个(私有)方法 - 并且返回类型必须是上面列出的类型之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-15
    • 2017-09-24
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 2022-11-10
    • 2013-03-30
    • 1970-01-01
    相关资源
    最近更新 更多