1

请查找代码中未在类中定义 getenuemrator() 方法的错误

private sealed class SelfAndBaseClasses : IEnumerable<Type>, IEnumerator<Type>, IEnumerable, IEnumerator, IDisposable
{
  private int state;
  private Type current;
  public Type type;
  private int initialThreadId;
  //public Type type;

  [DebuggerHidden]
  public SelfAndBaseClasses(int state)
  {
    this.state = state;
    this.initialThreadId = Thread.CurrentThread.ManagedThreadId;
  }

  private bool MoveNext()
  {
    switch (this.state)
    {
      case 0:
        this.state = -1;
        break;

      case 1:
        this.state = -1;
        this.type = this.type.BaseType;
        break;

      default:
        goto Label_0055;
    }
    if (this.type != null)
    {
      this.current = this.type;
      this.state = 1;
      return true;
    }
  Label_0055:
    return false;
  }

  [DebuggerHidden]
  IEnumerator<Type> IEnumerable<Type>.GetEnumerator()
  {
    ExpressionParser.SelfAndBaseClasses d;
    if ((Thread.CurrentThread.ManagedThreadId == this.initialThreadId) && (this.state == -2))
    {
      this.state = 0;
      d = this;
    }
    else
    {
      d = new ExpressionParser.SelfAndBaseClasses(0);
    }
    d.type = this.type;
    return d;
  }

  [DebuggerHidden]
  IEnumerator IEnumerable.GetEnumerator()
  {
    return this.System.Collections.Generic.IEnumerable<System.Type>.GetEnumerator();
  }

  [DebuggerHidden]
  void IEnumerator.Reset()
  {
    throw new NotSupportedException();
  }

  void IDisposable.Dispose()
  {
  }

  Type IEnumerator<Type>.Current
  {
    [DebuggerHidden]
    get
    {
      return this.current;
    }
  }

  object IEnumerator.Current
  {
    [DebuggerHidden]
    get
    {
      return this.current;
    }
  }
}
4

1 回答 1

3

好吧,既然你明确地实现了这两种GetEnumerator方法,你可以这样做:

IEnumerator IEnumerable.GetEnumerator()
{
    return ((IEnumerable<Type>)this).GetEnumerator();
}

但我有两个问题:

  1. 为什么要显式实现这两个接口?这根本不是惯用语。(编辑:现在很清楚为什么;这是生成的代码)。
  2. 这段代码甚至是由人类编写的吗?看起来很像 C# 编译器为迭代器块生成的内容。如果是这样,你是如何得到它的?反编译器?请注意,反编译器在正确的IL 上出错并生成无法编译的 C# 代码是很常见的。

编辑:我查看了带有 Reflector 的迭代器块的反编译代码(我怀疑这是您正在使用的反编译器?)。它似乎确实证明了这个错误,即非通用版本反编译为明显无效:

return this.System.Collections.Generic.IEnumerable<Foo>.GetEnumerator(); 

编辑:编译它所需的其他修复似乎是:

  1. MoveNext将方法的可访问性更改为public.
  2. 删除泛型方法ExpressionParser.中的提及。 GetEnumerator

你可以在Ideone上试试。

foreach (Type t in new SelfAndBaseClasses(0) { type = typeof(string) })
   Console.WriteLine(t);

输出:

System.String
System.Object

如果您能更好地解释您真正想做的事情,我们可以为您提供更好的帮助。修复不正确的反编译代码并不好玩。例如,如果您需要为类型层次结构编写枚举器,那么使用迭代器块会容易得多,而不是去反编译 Dynamic LINQ。

于 2010-12-19T10:45:24.563 回答