【问题标题】:CS1023 Embedded statement cannot be a declaration or labeled statementCS1023 嵌入式语句不能是声明或标签语句
【发布时间】:2019-02-18 20:03:35
【问题描述】:

我有一个可以正常工作的程序。这是一个正确的代码。

public static double Smth(int x, int y, double[,] original, int lengthX, int lengthY)
        {
            var pixelsFields = new List<double>();
            double median;
            for (int areasX = -1; areasX < 2; areasX++)
                for (int areasY = -1; areasY < 2; areasY++)
                    if ((x + areasX > -1) && (y + areasY > -1) && (x + areasX < lengthX) && (y + areasY < lengthY))
                        pixelsFields.Add(original[x + areasX, y + areasY]);

但是,我想改进我的代码。表达式“x + areaX”和“y + areaY”经常重复,所以我决定创建两个变量。不幸的是,我对新变量有一个错误:“错误 CS1023:嵌入式语句不能是声明或标记语句”。

public static double Smth(int x, int y, double[,] original, int lengthX, int lengthY)
            {
                var pixelsFields = new List<double>();
                double median;
                for (int areasX = -1; areasX < 2; areasX++)
                    for (int areasY = -1; areasY < 2; areasY++)
                        var diffX = x + areasX;
                        var diffY = y + areasY;
                        if ((diffX > -1) && (diffY > -1) && (diffX < lengthX) && (diffY < lengthY))
                            pixelsFields.Add(original[diffX, diffY]);

你能帮我纠正一下吗?

【问题讨论】:

  • 尝试声明 var diffX 和 diffY 来处理 pxelsFields
  • 你需要大括号来表达你的 for 循环的范围。不建议使用大括号来表示范围。它可能会令人困惑并导致此类错误

标签: c#


【解决方案1】:

for 循环后缺少括号

 public static double Smth(int x, int y, double[,] original, int lengthX, int lengthY)
   {
        var pixelsFields = new List<double>();
        double median;
        for (int areasX = -1; areasX < 2; areasX++)
            for (int areasY = -1; areasY < 2; areasY++)
            {
                var diffX = x + areasX;
                var diffY = y + areasY;
                if ((diffX > -1) && (diffY > -1) && (diffX < lengthX) && (diffY < lengthY))
                    pixelsFields.Add(original[diffX, diffY]);
            }

【讨论】:

    【解决方案2】:

    在 C# 中,iffor 之类的构造仅捕获下一条语句,而不考虑空格。当你写:

    var pixelsFields = new List<double>();
    double median;
    for (int areasX = -1; areasX < 2; areasX++)
        for (int areasY = -1; areasY < 2; areasY++)
            var diffX = x + areasX;
            var diffY = y + areasY;
            if ((diffX > -1) && (diffY > -1) && (diffX < lengthX) && (diffY < lengthY))
                pixelsFields.Add(original[diffX, diffY]);
    

    该语言将其解释为以下内容(我们假设空格/缩进 很重要):

    var pixelsFields = new List<double>();
    double median;
    for (int areasX = -1; areasX < 2; areasX++)
        for (int areasY = -1; areasY < 2; areasY++)
            var diffX = x + areasX;
    var diffY = y + areasY;
    if ((diffX > -1) && (diffY > -1) && (diffX < lengthX) && (diffY < lengthY))
        pixelsFields.Add(original[diffX, diffY]);
    

    正如其他答案所提到的,解决方案是使用大括号{},例如:

    var pixelsFields = new List<double>();
    double median;
    for (int areasX = -1; areasX < 2; areasX++)
    {
        for (int areasY = -1; areasY < 2; areasY++)
        {
            var diffX = x + areasX;
            var diffY = y + areasY;
            if ((diffX > -1) && (diffY > -1) && (diffX < lengthX) && (diffY < lengthY))
            {
                pixelsFields.Add(original[diffX, diffY]);
            }
        }
    }
    

    大多数样式指南都要求您使用这样的大括号。如果不这样做,当您添加另一个语句时,您可能会意外地导致循环中的语句不再处于该循环中,正如您在本例中看到的那样。

    至于您遇到的具体错误,您的内部 for 循环只有一个语句:var diffX = x + areasX;CS1023 的出现是因为这个单一的语句是一个变量声明。语言禁止这样做,可能是为了避免我提到的问题,也可能是因为这样的变量的范围是立即结束还是到下一个} 结束在语法上是不明确的。

    【讨论】:

      猜你喜欢
      • 2018-04-18
      • 2016-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多