"??运算符不能应用于'int'和'int'类型的操作数"

18

我有一个查询,它给了我一个异常。现在 j.job_quote.JobQuoteID 是一个标识列,但是它是空的,所以我正在尝试创建一个检查,如果为空则将其标识为0。请帮忙解决问题并告诉我如何处理。

var Qryjob = (from j in at.jobs 

                     where j.JobID == Convert.ToInt32(jobid)
                     select new {
                         JobID = j.JobID,
                         InsertedDate = j.InsertedDate,
                         FirstName = j.user.FirstName,
                         LastName = j.user.LastName,
                         City = j.user.City,
                         ServiceName = j.service.ServiceName,
                         ServiceTypeName = j.service_type.ServiceTypeName,
                         BudgetName = j.budget.BudgetName,
                         IsApproved = j.IsApproved,
                         IsAssigned = j.IsAssigned,
                         IsQuoted = j.IsQuoted,
                         job_notif_price = j.job_notif_price,
                         Description = j.Description,
                         PaymentTypeName = j.payment_type.PaymentTypeName,
                         DuePeriodName = j.due_period.DuePeriodName,
                         QuoteStatus = j.job_quote.QuoteStatus,
                         JobStatus = j.job_quote.JobStatus,
                         comments = j.job_quote.comments,
                         IsPartnerApply = j.job_quote.IsPartnerApply,
                         Applycomment = j.job_quote.ApplyComments,
                         JobQuoteID = j.job_quote.JobQuoteID ?? 0
                     }).ToList();
4个回答

58
< p >在??运算符的左侧必须是可为空的变量(这意味着您可以将null赋值给它),在您的情况下,JobQuoteID 的类型应该是int?而不是int


12
编译器告诉您,j.job_quote.JobQuoteID 的类型为int。由于它是非空值类型,因此int 不能为 null。??运算符不能用于不可为空的类型。

7

这是空值合并运算符,仅适用于可空类型,或者说左侧必须是可空类型(如果我说的不对,请原谅我,我的意思是所有Nullable<T>和引用类型)。如果你有int?而不是int,它就可以工作。该运算符是二元的,并且像这样工作:a ?? b表示如果a为空,则使用b的值。您可以链式地多次使用此运算符。所以,假设a、b和c都是可空的整数,我可以这样做:int willNeverBeNull = a ?? b ?? c ?? 4,它会取第一个非空值。


1
正如@Servy所说,问题不在于JobQuoteID,我认为错误是因为你的job_quote对象为空,因此表达式应该是:
JobQuoteID = (j.job_quote ?? new job_quote { JobQuoteID = 0 }).JobQuoteID

希望这能解决你的问题。

这很简单和原始! - S.H.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接