我能让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#在技术上无效,如果它无效,在我的特定场景中克服这个问题的最干净方法是什么?

我能让Visual Studio明白这不是空的吗?

这不是一个错误(除了它是获得最终决定权的编译器)。

您可以将.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);