我能让Visual Studio明白这不是空的吗?
本文关键字:这不是 明白 Visual Studio | 更新日期: 2023-09-27 18:35:52
所以我的控制器操作的开头是
[HttpGet]
public ActionResult FillOut ( Guid pid, int? sid )
{
// pid: partner id
// sid (optional): survey id
// if survey id not supplied in query string, find which survey the user should be on
if ( sid == null )
{
sid = this._Db.CheckIfFinished(pid, 1) ? 2 : 1;
}
ViewBag.pid = pid;
ViewBag.sid = sid;
ViewBag.finished = this._Db.CheckIfFinished(pid,sid);
ViewBag.survtitle = this._Db.GetSurveyTitle(sid);
var AllAnswers = this._Db.GetAnswersByPartner(pid,sid);
VS不高兴,因为我的方法this._Db.CheckIfFinished(pid,sid);
,this._Db.GetSurveyTitle(sid);
和this._Db.GetAnswersByPartner(pid,sid)
期望sid
参数是int
而不是int?
。但是根据我如何使用它,sid
保证是非空的。那么这是一个Visual Studio错误还是我的C#在技术上无效,如果它无效,在我的特定场景中克服这个问题的最干净方法是什么?
这不是一个错误(除了它是获得最终决定权的编译器)。
您可以将.Value
粘贴到需要实际int
的任何地方,或者由于您需要它很多次,请创建另一个不可为空的int
变量来存储该值。
对于可为 null 的类型,请使用 .Value
获取基础值。因此,在这种情况下,sid.Value
将返回您想要的int
。
您还可以通过 HasValue
属性检查变量是否具有值。
当您检查该sid != null
(或sid.HasValue
)时,可以使用sid.Value
来获取不可为空的int
值是安全的。
如果你确定,那么使用参数?。取值
[HttpGet]
public ActionResult FillOut ( Guid pid, int? sid )
{
// pid: partner id
// sid (optional): survey id
// if survey id not supplied in query string, find which survey the user should be on
if ( !sid.HasValue )
{
sid = this._Db.CheckIfFinished(pid, 1) ? 2 : 1;
}
ViewBag.pid = pid;
ViewBag.sid = sid;
ViewBag.finished = this._Db.CheckIfFinished(pid,sid);
ViewBag.survtitle = this._Db.GetSurveyTitle(sid);
var AllAnswers = this._Db.GetAnswersByPartner(pid,sid.Value);
它是一个可为空的整数,不是空的,但是以我如何使用它,sid 保证是非空的。
但它仍然是一个可为空的整数。它的目的就是可能为空。
可以使用其Value
属性获取int
值。
如果您绝对确定它不是 null,那么作为优化,您可以调用其 GetValueOrDefault()
方法(不将值用作默认值的重载)。因为此方法不测试值是否设置为 null,所以速度更快。但是,只有在您 100% 确定它不能为 null 时才使用此优化(例如,在完全检查之后,或将其设置为非 null 值),因为如果它是 null,它只会返回 0
而不是抛出一个会指出您的错误的异常。
只需使用它,即可获取存储在 int?-容器内的实际 int-值:
ViewBag.pid = pid;
ViewBag.sid = sid.Value;
ViewBag.finished = this._Db.CheckIfFinished(pid, sid.Value);
ViewBag.survtitle = this._Db.GetSurveyTitle(sid.Value);
var AllAnswers = this._Db.GetAnswersByPartner(pid, sid.Value);