You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#编译报错:第21行无法在声明局部变量'year'前使用该变量

报错原因

这是C#局部变量的基础语法规则限制:

  • C#没有类似JS的变量提升机制,方法内定义的局部变量必须严格遵循先声明赋值、后引用使用的顺序,只要在声明语句前的位置引用该变量,编译器就会直接抛出这个错误。
  • 你的代码中,year变量的声明语句int year = 2022;写在了输出出生年份的Console.WriteLine语句之后,但输出语句里已经提前用了year,直接触发该编译错误。
  • 这段代码还存在3个会导致后续编译/运行失败的隐藏问题:
    • 存储用户姓名的name被定义为int类型,姓名本身是文本内容,只要用户输入非数字内容,Convert.ToInt32会直接抛出运行时异常
    • 字符串拼接和算术运算混写存在优先级问题:即使把year声明提前,"WoW " + name + " you were born in " + year - age这段代码会先完成前面的字符串拼接得到一个字符串结果,再尝试对字符串做减age的操作,触发新的编译错误,必须给算术计算部分加小括号明确优先级
    • 你先给year赋值2022,紧接着又调用Console.ReadLine()读取用户输入覆盖year值,属于完全多余的逻辑,会打乱出生年份的计算逻辑。
修复方案

按执行顺序调整代码结构,修正类型和逻辑问题:

  • 将year变量的声明赋值移动到使用它的输出语句之前
  • 把name变量的类型从int改为string,直接接收用户输入的姓名文本,不需要做整数转换
  • 给year - age的计算部分加小括号,让算术运算先完成,再参与字符串拼接
  • 删除重复读取year输入的冗余代码,如果需要动态获取当前年份,可以直接用DateTime.Now.Year替代固定值2022

修复后可正常编译运行的代码:

using System;

namespace Project_1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.Write("What is your name: ");
            string name = Console.ReadLine();
            Console.WriteLine("Hi " + name);
            Console.ReadLine();
            
            Console.Write("What is your age: ");
            int age = Convert.ToInt32(Console.ReadLine());
            int year = 2022;
            // 计算部分加括号明确运算优先级
            Console.WriteLine("WoW " + name + " you were born in " + (year - age));
        
            Console.ReadLine();
        }
    }
}

内容的提问来源于stack exchange,提问作者Stevon Forbes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 22:18:42