为什么我不能使用'操作符返回IValueConverter中的惰性列表

本文关键字:IValueConverter 返回 列表 操作符 不能 为什么 | 更新日期: 2023-09-27 18:13:24

假设我有以下类:

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

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

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 }

为什么我不能使用'操作符返回IValueConverter中的惰性列表

只有在返回类型为下列类型之一时才定义迭代器块:

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

生成的迭代器变成了一个状态机,它完成了一个非常特定的契约,提供了多个值的延迟执行和延迟迭代。

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

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