C#访问switch语句内定义的SUBJECT等变量报上下文不存在错误求助
问题原因
- 这是C#的变量作用域规则导致的:在
case分支的大括号{}内部声明的SUBJECT、BODY变量,作用域仅局限于当前分支的大括号范围内,跳出switch语句后这些变量就已经被销毁,所以外部访问会提示不存在。 - 你当前每个分支里都是重新声明新的局部变量,而不是给公共变量赋值,自然外部拿不到对应值。
修复方案
基础修复(保持现有switch结构不变)
提前在switch语句外部声明两个变量,分支内只做赋值操作即可,示例代码:
// 提前在switch外声明变量,作用域覆盖后续的邮件构造逻辑 string SUBJECT = string.Empty; string BODY = string.Empty; switch (mainMenu.SelectedApplication) { case "Application1": LogHandler.Log(LogTarget.File, "Selected Application: Application 1 Queued"); // 直接赋值,不要加string重新声明 SUBJECT = "blah blah"; BODY = "blah blah"; break; case "Application2": LogHandler.Log(LogTarget.File, "Selected Application: Application 2 Queued"); SUBJECT = "blah blah"; BODY = "blah blah"; break; case "Application3": LogHandler.Log(LogTarget.File, "Selected Application: Application 3 Queued"); SUBJECT = "blah blah"; BODY = "blah blah"; break; // 建议加默认分支处理异常情况 default: throw new NotSupportedException($"不支持的应用类型:{mainMenu.SelectedApplication}"); } // 后续可以正常调用变量构造邮件 MailMessage message = new MailMessage(); message.Subject = SUBJECT; message.Body = BODY;
优化方案(推荐,减少冗余代码)
如果后续应用数量会增加,可以用字典存储配置,完全省略switch语句,后续新增应用只需要添加字典项即可:
// 定义应用配置字典,key是应用名,value是元组存储主题和正文 var appMailConfig = new Dictionary<string, (string Subject, string Body)> { {"Application1", ("blah blah", "blah blah")}, {"Application2", ("blah blah", "blah blah")}, {"Application3", ("blah blah", "blah blah")} }; // 校验应用是否存在 if (!appMailConfig.TryGetValue(mainMenu.SelectedApplication, out var config)) { throw new NotSupportedException($"不支持的应用类型:{mainMenu.SelectedApplication}"); } // 打日志 LogHandler.Log(LogTarget.File, $"Selected Application: {mainMenu.SelectedApplication} Queued"); // 直接取配置构造邮件 MailMessage message = new MailMessage(); message.Subject = config.Subject; message.Body = config.Body;
内容的提问来源于stack exchange,提问作者Dean Reid
相关产品推荐
相关产品推荐

