在关注控制器上我无法分配名为“电子邮件”的变量。我在这个变量上遇到错误。请检查picture1 picture2以便更好地了解。问题是如何解决这个错误的呢?
//[HttpPost]
[HttpPost, ValidateInput(false)]
public ActionResult EmailCampaignProcess(FormCollection collection)
{
var Emails;
var userType = Request["userType"];
var emailContent = Request["emailContent"];
if (userType == "subscriber")
{
Emails = db.Users.Where(d => d.Subscriptions.Any(x => x.Status == true)).Select(u => u.Email).ToArray();
}
else if(userType == "unsubscriber")
{
Emails = db.Users.Where(d => d.Subscriptions.Any(x => x.Status == false)).Select(u => u.Email).ToArray();
}
else if (userType == "protentialClient")
{
Emails = db.Users.Where(d => d.Subscriptions.Any(x => x.Status == false)).Select(u => u.Email).ToArray();
}
foreach (string Email in Emails) {
SendSimpleMessage(Email);
}
return HttpNotFound();
}
答案 0 :(得分:1)
在C#中,我认为你必须声明你声明的变量的实际类型。将它改为
string[] Emails;
解决你的问题?
答案 1 :(得分:1)
首先,var Emails;
导致了此错误:
必须初始化隐式类型的局部变量。
这意味着您无法在不初始化值的情况下使用var
定义变量,因为type of value
定义了type of variable
,因此您可以将其初始化为:
string[] Emails = null;
或
var Emails = new string[] { };
之后,因为您的if-else if
结构中没有其他内容,您必须使用非值数据进行初始化,例如第二个。
答案 2 :(得分:0)
虽然您可以使用Tim Leach的答案解决您所描述的问题,但是当您循环浏览电子邮件时,可能会在以后遇到NullReference错误。毕竟,如果出于任何原因userType
不是您编程的三个选项,则不会分配任何电子邮件。
因此,您可以考虑
var Emails = new string[0];
或者只是在userType
上添加一个测试,或者在你的foreach之前进行一次空检查。
另外,请考虑遵循标准命名约定,这意味着您的变量应为emails
,而不是Emails
。
最后,考虑通过执行类似
的操作来简化重复代码var status = userType == "subscriber";
var emails = Emails = db.Users.Where(d => d.Subscriptions.Any(x => x.Status == status)).Select(u => u.Email).ToArray();
现在您不再需要单独的声明,并且可以删除三个if语句。
答案 3 :(得分:0)
使用OnElementChanged
仅在声明并为变量赋值时起作用,并且可以从表达式中推断出值的类型。
在这种情况下,编译器无法知道要分配给Emails变量的值。
从下面的代码判断为值赋值给变量,您应该将其声明为其他答案所建议的字符串数组。
var