我有以下情景:
public JsonResult ChangeFilterList(int option)
{
var data = new[] { new { Text = "Unknown option", Value = -1 } };
switch (option)
{
case 2: data = _departmentnameRepository.All.Select(x => new { Text = x.DeptName, Value = x.Id }).ToArray();
break;
case 3: data = Session["projectid"] == null
? _assetSequenceRepository.All.Select(x => new { Text = x.AssetShotName, Value = x.Id }).ToArray()
: _assetSequenceRepository.FindBy(p => p.ProjectId == (int)Session["projectid"]).Select(x => new { Text = x.AssetShotName, Value = x.Id }).ToArray();
break;
default: data = _userRepository.All.Select(x => new { Text = x.DisplayName, Value = x.UserID }).ToArray();
break;
}
return Json(data, JsonRequestBehavior.AllowGet);
}
case2
和default
看起来很好,但在第3个条件语句中抱怨说:Cannot implicitly convert type 'AnonymousType#1[]' to 'AnonymousType#2[]'
。既然我已经提供了匿名类型的蓝图作为var data = new[] { new { Text = "Unknown option", Value = -1 } };
,那么?:
不应该能够决定类型吗?
解决方案:
@Darin Dimitrov的答案很好,但我想对匿名类型进行一些测试(简单情况总是需要的)。
正如@Douglas所怀疑的那样:我的assetSequenceRepository
正在提供id
作为long
,而匿名Value
更倾向于int
而不是long
。由于C#编译器不会隐式地将long
转换为int
,所以我得到了错误。编译片段如下:
public JsonResult ChangeFilterList(int option = 3)
{
var data = new[] { new { Text = "Unknown option", Value = long.MaxValue } };
switch (option)
{
case 2: data = _departmentnameRepository.All.Select(x => new { Text = x.DeptName, Value = (long)x.Id }).ToArray();
break;
case 3: data = Session["projectid"] == null
? _assetSequenceRepository.All.Select(x => new { Text = x.AssetShotName, Value = x.Id }).ToArray()
: _assetSequenceRepository.FindBy(p => p.ProjectId == (int)Session["projectid"]).Select(x => new { Text = x.AssetShotName, Value = x.Id }).ToArray();
break;
default: data = _userRepository.All.Select(x => new { Text = x.DisplayName, Value = (long)x.UserID }).ToArray();
break;
}
return Json(data, JsonRequestBehavior.AllowGet);
}
?:
语句替换为一个if...else
块。 - Douglasif...else
时遇到了什么错误信息?这个错误是在if
赋值、else
赋值还是两者都有? - Douglasswitch
块中将被丢弃,因此将数据初始化为new[] { new { Text = "Unknown option", Value = -1 } }
是不必要的。 - Ahmed KRAIEMif
和else
块都出现了相同的错误。 - Bishnu Rawalvar data;
或者var data = null
,编译器会抱怨:将某些东西分配给隐式变量data
并且不能将null
分配给data
。 - Bishnu Rawal