【问题标题】:Why does one line error but the other one doesn't?为什么一条线出错而另一条没有?
【发布时间】:2012-05-08 22:49:32
【问题描述】:

我的问题确实很简单,但数小时的 Google 并没有为我(显然)独特的情况提供答案。 问题是在以下代码中使用了未分配的变量

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SimpleBasicCompiler
{
    class Lines : System.Collections.IEnumerable
    {
        // Variables
        private ArrayList<string> lines;

        // Constructor
        public Lines()
        {
            lines = new ArrayList();
        }

        public void Add(string line)
        {
            lines.add(line);
        }

        // Iterator
        public System.Collections.IEnumerator GetEnumerator()
        {
            for (int i = 0; i < lines.length(); i++)
            {
                yield return lines[i];
            }
        }

        public void Print()
        {
            foreach (string line in lines)
            {
               XFormMain.SetStatus(line); // this line errors
               System.Console.Write(line); // this line dosn't
            }
        }

    } // End Class Lines
} // End namespace

我的问题是为什么? 我无法更改声明,否则会使迭代器语法无效 我什至尝试了以下

public void Print()
    {
        string lineB = "";
        foreach (string line in lines)
        {
           lineB = line; // now this line errors
           XFormMain.SetStatus(lineb); // and this line doesn't
           System.Console.Write(line); // this line doesn't in either situation
        }
    }

我想如果我知道为什么一条线有效而一条线我无法弄清楚但是.....有什么想法吗?

【问题讨论】:

  • 错误到底说了什么?
  • 你为什么要使用ArrayList?
  • 你应该返回 lines.GetEnumerator() 而不是产生项目。
  • 我们应该如何知道它为什么不起作用?我们是人类,而不是不完整的代码 sn-p 编译器。发布错误消息。
  • .NET 中还有ArrayList&lt;string&gt; 这样的类吗?

标签: c# compiler-errors


【解决方案1】:

您发布的代码存在严重问题(即使没有Print 方法,也无法编译)。不存在 ArrayList&lt;T&gt; 类。我想应该是List&lt;string&gt;。我还从未见过ArrayList 的适当用法。

你得到的错误可能是因为ArrayList 是无类型的(这使得它成为一个糟糕的列表实现),但你却要求它提供字符串。编译器知道它可能包含任意对象,它会阻止您假设它只有字符串。

我想第二行没有出错的原因是因为编译器在遇到第一个错误时停止了。

【讨论】:

    【解决方案2】:

    试试这个:

    foreach (string line in lines.ToArray(typeof(string)))         
    {
    

    【讨论】:

      【解决方案3】:

      这样编译:

          class Lines : System.Collections.IEnumerable {
              // Variables
              private ArrayList lines;
      
              // Constructor
              public Lines() {
                  lines = new ArrayList();
              }
      
              public void Add(string line) {
                  lines.Add(line);
              }
      
              // Iterator
              public System.Collections.IEnumerator GetEnumerator() {
                  for (int i = 0; i < lines.Count; i++) {
                      yield return lines[i];
                  }
              }
      
              public void Print() {
                  string lineB = "";
                  foreach (string line in lines)
                  {
                     lineB = line;
      //               XFormMain.SetStatus(lineb);
                     System.Console.Write(line); 
                  }
              }
          }
      

      有几个问题:

      ArrayList 在 System.Collections,而不是 System.Collections.Generic

      ArrayList 不是泛型,所以ArrayList&lt;string&gt; 不正确

      ArrayList.add 不存在

      ArrayList.length() 不存在

      这是一个可能会有所帮助的建议。先编写一点代码,然后看看它是否可以编译。从空的类声明开始。如果你的类是从另一个类派生的,那么添加下一个,并存根基类或接口所需的任何方法以使其编译。一次添加一个方法的内部结构,并在完成每个方法时进行编译。经常像这样编译将避免由代码中的多个错误引起的奇怪问题。它还会阻止您及早进入错误的轨道,例如将 ArrayList 用作泛型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-05
        • 1970-01-01
        • 1970-01-01
        • 2022-12-04
        • 1970-01-01
        • 2016-06-07
        • 1970-01-01
        相关资源
        最近更新 更多