use*_*620 2 .net c# sql-server asp.net null-coalescing-operator
为什么尝试设置时,我得到一个无效转换异常NULL从数据库里面的返回值Comments是类型Int32.
我想替换这个:
try
{
objStreamItem.Comments = (Int32)sqlReader["Comments"];
if (objStreamItem.Comments > 0) {
listComments = Comment.GetAll(objStreamItem.Id);
}
}
catch (InvalidCastException)
{
// Execute if "Comments" returns NULL
listComments = null;
objStreamItem.Comments = 0;
}
Run Code Online (Sandbox Code Playgroud)
有了这个:
Comments = ((Int32?)sqlReader["Comments"]) ?? 0
Run Code Online (Sandbox Code Playgroud)
这两者在不同的背景下,但你应该得到这个想法.我试图以更优雅的方式解决这个问题,而不是使用try catch块.
谢谢.
它作为可空整数存储在数据库中.
public int? Comments
{
get;
set;
}
Run Code Online (Sandbox Code Playgroud)
DBNull当值为null时,您的SQL阅读器将返回; 没有转换DBNull为int?,并且空合并运算符无法识别DBNull.Value需要合并的内容.
编辑3
(原始代码的另一个问题:如果"注释"非空,但GetAll()会抛出"注释",则假定"注释"返回null InvalidCastException.)
正如hvd指出的那样,你可以使用具有可空类型的as运算符:
objStreamItem.Comments = sqlReader["Comments"] as int?;
listComments = (objStreamItem.Comments ?? 0) > 0 ? Comment.GetAll(objStreamItem.ID) : null;
Run Code Online (Sandbox Code Playgroud)
但是,如果您只是定义Comment.GetAll()为在传递给它的ID没有注释时返回空列表或空引用,则可以避免所有这些.