【问题标题】:Using foreach with ArrayList - automatic casting?将 foreach 与 ArrayList 一起使用 - 自动转换?
【发布时间】:2011-06-13 15:26:41
【问题描述】:
ArrayList x=new ArrayList();
x.Add(10);
x.Add("SS");

foreach(string s in x)
{
}

这是否意味着当 foreach 运行时它会尝试将数组列表的元素强制转换为输入 foreach 表达式?

【问题讨论】:

  • 我知道它的作用,只是不确定是否有从对象到指定类型的内部转换。
  • 不幸的是,foreach 确实将 x 的元素隐式转换为为循环变量指定的类型,即使转换通常是显式的。我们从前泛型时代继承下来的丑陋事物之一。

标签: c# casting arraylist


【解决方案1】:

是的,如果一个元素不能转换为该类型,您将获得一个InvalidCastException。在您的情况下,您不能将装箱的 int 转换为 string 导致抛出异常。

本质上相当于:

foreach (object __o in list) {
    string s = (string)__o;
    // loop body
}

【讨论】:

    【解决方案2】:

    根据c#specification的foreach语句,你的代码相当于

    ArrayList x=new ArrayList();
    x.Add(10);
    x.Add("SS");
    
    IEnumerator enumerator = (x).GetEnumerator();
    try {
       while (enumerator.MoveNext()) {
          string element = (string)enumerator.Current; // here is casting occures
          // loop body;
       }
    }
    finally {
       IDisposable disposable = enumerator as System.IDisposable;
       if (disposable != null) disposable.Dispose();
    }
    

    【讨论】:

      【解决方案3】:

      是的,当然,当您运行该循环并使用 进行转换时,编译器将尝试将其转换为指定的类型,在您的情况下它将是 String。如果它不能这样做,它将引发 InvalidCastException。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-21
        • 2013-10-17
        • 1970-01-01
        • 2020-07-22
        • 1970-01-01
        • 1970-01-01
        • 2017-05-26
        相关资源
        最近更新 更多