c#开关中的变量范围

c#开关中的变量范围,c#,scope,switch-statement,C#,Scope,Switch Statement,我试图发送一封电子邮件,其中发件人和收件人的电子邮件地址(以及主题和正文内容)根据提供给该方法的值而变化。最好用代码本身来解释: public void EmailNotification(int emailAction) { MailAddress to; MailAddress from; string subject; string body; switch (emailAction)

我试图发送一封电子邮件,其中发件人和收件人的电子邮件地址(以及主题和正文内容)根据提供给该方法的值而变化。最好用代码本身来解释:

public void EmailNotification(int emailAction)
    {

        MailAddress to;
        MailAddress from;
        string subject;
        string body;

        switch (emailAction)
        {
            case 1:
                // Comment approved
                to = new MailAddress("someone@theirdomain.com");
                from = new MailAddress("no-reply@thisdomain.com");
                subject = "Comment approved";
                body = @"The comment you posted has been approved";
                break;
            case 2:
                // Comment rejected
                to = new MailAddress("someone@theirdomain.com");
                from = new MailAddress("no-reply@thisdomain.com");
                subject = "Comment rejected";
                body = @"The comment you posted has been rejected";
                break;
        }

        MailMessage message = new MailMessage(from, to);
        message.Subject = subject;
        message.Body = body;
        SmtpClient client = new SmtpClient();

        try
        {
            client.Send(message);
        }
        catch (Exception ex)
        {
            Console.WriteLine("Exception caught in EmailNotification: {0}", ex.ToString());
        }
    }
所以问题是,由于作用域如何与开关一起工作,to、from、subject等的值在开关之外无法识别,即使我在开关之外声明了它们(可能是错误的?)


我是一名.NET新手,因此,如果您在这里就如何进行此类操作提出任何建议,我将不胜感激。

问题在于您没有初始化变量。如果
emailAction
的值既不是
0
也不是
1
,变量的值会是什么?它们将未初始化,这是非法的。因此,要么初始化它们,要么在switch语句中添加一个引发异常的
default:
子句。要么:

MailAddress to = null;
MailAddress from = null;
string subject = null;
string body = null;
或:


问题是您没有初始化变量。如果
emailAction
的值既不是
0
也不是
1
,变量的值会是什么?它们将未初始化,这是非法的。因此,要么初始化它们,要么在switch语句中添加一个引发异常的
default:
子句。要么:

MailAddress to = null;
MailAddress from = null;
string subject = null;
string body = null;
或:


您需要将变量初始化为默认值,或者在
default
情况下初始化它们。不能保证执行开关情况,因此编译器不知道将初始化值。

您需要将变量初始化为默认值,或者在
默认情况下初始化它们。开关情况不能保证执行,因此编译器不知道值将被初始化。

我认为范围没有问题,但确保值被初始化有问题

将“case2:”替换为“Default:”将允许代码进行编译,并将空值设置为变量(将maildaddress设置为null,将字符串设置为null或“”),但我不建议这样做

简而言之,它失败的原因是,如果emailAction等于、3或除1或2以外的任何值,则switch语句中不会执行任何操作,然后您将尝试在表达式中使用未初始化的变量


有关什么是初始化的更多信息(如果这对您来说太低,请抱歉),请尝试阅读:。

我认为范围没有问题,但确保值初始化有问题

将“case2:”替换为“Default:”将允许代码进行编译,并将空值设置为变量(将maildaddress设置为null,将字符串设置为null或“”),但我不建议这样做

简而言之,它失败的原因是,如果emailAction等于、3或除1或2以外的任何值,则switch语句中不会执行任何操作,然后您将尝试在表达式中使用未初始化的变量


有关什么是初始化的详细信息(如果这对您来说太低,请抱歉),请尝试阅读:。

您不能在切换之前声明
MailMessage
对象,然后使用
message.To=new mailmaddress(“…”)
在开关内部?您不能在开关之前声明
MailMessage
对象,然后使用
message.To=newmaildaddress(“…”)开关内部?