2013-04-20 65 views
0

的GetEnumerator强制转换为接口失败
没有编译器错误
与邮件索引无穷运行故障
如果我使用结构Word1252直接与无界面它的工作原理List泛型GetEnumerator的强制转换为接口失败

namespace WordEnumerable 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      WordEnum wordEnum = new WordEnum(); 
      Debug.WriteLine(wordEnum[0].GetType().ToString()); 
      Debug.WriteLine(wordEnum[0].Value); 
      Debug.WriteLine(wordEnum.Count.ToString()); 
      foreach (iWord w in wordEnum) // fails here 
      { 
      } 
     } 
    } 
} 
public interface iWord 
{ 
    Int32 Key { get; } 
    String Value { get; } 
} 
public class WordEnum : IEnumerable<iWord> 
{ 
    private static List<Word1252> words1252 = new List<Word1252>(); 
    IEnumerator<iWord> IEnumerable<iWord>.GetEnumerator() 
    { 
     return ((IEnumerable<iWord>)words1252).GetEnumerator(); 
    } 
    public struct Word1252 : iWord 
    { 
     public UInt64 packed; 
     public Int32 Key { get { return (Int32)((packed >> 27) & ((1 << 25) - 1)); } } 
     public Byte Length { get { return (Byte) ((packed >> 59) & ((1 << 5) - 1)); } } 
     public String Value { get { return Key.ToString(); } } 
     public Word1252(UInt64 Packed) { packed = Packed; } 
    } 

回答

1

简而言之,这是upcastingIEnumerable<Word1252>IEnumerable<IWord>,

这就需要covariance工作。

即使IEnumerable的被标记为out(协)
协方差不适合工作“价值型” - 即结构你有 接口定义。

例如,看到...

Is this a covariance bug in C# 4?
(或有点不同,但归结为同一个问题)
Why cannot IEnumerable<struct> be cast as IEnumerable<object>?

要解决你可以定义列表像

private static List<iWord> words1252 = new List<iWord>(); 

或定义你的这样的统计员:

IEnumerator<iWord> IEnumerable<iWord>.GetEnumerator() 
{ 
    foreach (var word in words1252) 
     yield return word; 
} 
+0

他们都工作感谢。随着私有静态列表 words1252 =新名单();我必须投入Word1252以获得内部资源,但我会采取这种方式。你知道如果foreach有性能损失吗?如果不是,我宁愿使用它。 – Paparazzi 2013-04-21 00:15:11

+0

欢迎您。 “foreach”更好,我同意。有没有性能影响有(或某些运算最多额外) - 这是“屈服”,因为它去 - 所以基本上做和原来一样“枚举” - 这是“铸造”内'调查员已知和接受的方法(即当你需要返回不同的物品 - 但无法施放时) – NSGaga 2013-04-21 00:18:27

相关问题