来自VB,这对我来说似乎很奇怪,所以我确信有更好的方法来做到这一点......
string pulledUserName = ""; // To allow the pulledUserName to be usable in the var result line below ? Really? If's have their own scope in C#?
if (await UserManager.FindByNameAsync(model.Email) == null)
{
var user = await UserManager.FindByEmailAsync(model.Email);
if (user != null)
{
pulledUserName = user.UserName;
}
}
else
{
var user = await UserManager.FindByNameAsync(model.Email);
pulledUserName = user.UserName;
}
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, change to shouldLockout: true
var result = await SignInManager.PasswordSignInAsync(pulledUserName, model.Password, model.RememberMe, shouldLockout: false);
我的第一次走动我在IF语句中使用字符串pullUserName = yadda yadda分配了pullUserName ...并且它给了我一个波形,说它不在正确的范围内,所以如果我" Dim&#34 ; (是的,我知道,在C#问题中的VB术语)它在if语句之上,它工作正常。所以两部分问题, 1:这真的是这样的,还是我错过了什么? 2:这对我来说似乎很笨拙有没有更好的方法来解决这个问题?
答案 0 :(得分:4)
就个人而言,我会重新整理一些更整洁的东西......
var username = await UserManager.FindByNameAsync(model.Email) ??
await UserManager.FindByEmailAsync(model.Email);
var pulledUserName = username?.UserName;
var result = await SignInManager.PasswordSignInAsync(pulledUserName,
model.Password,
model.RememberMe,
shouldLockout: false);
??
运算符称为null coalescing operator,如果它不为null,则返回第一个值,否则返回正确的值。 ?.
称为null-conditional,如果username
为空,则返回null,否则返回username.UserName
值。
在尝试将pulledUserName
传递给登录管理器之前检查column-width
是否为空可能很重要,但这很简单。
要直接回答你的问题,范围在c#中的工作方式与在VB中的工作方式相同。您不能使用在当前范围之外定义的变量,所以这是它的工作原理。解决它的方法是构建代码,以避免创建不必要的范围。在C#,{和}中,即使在if语句的上下文中,也定义了一个新范围。