使用null-coalescing作为try catch块的替代

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块.

谢谢.

UPDATE

它作为可空整数存储在数据库中.

    public int? Comments
    {
        get;
        set;
    }
Run Code Online (Sandbox Code Playgroud)

我只想感谢所有回答或发布此问题的人,一切都非常有用.谢谢!

pho*_*oog 7

DBNull当值为null时,您的SQL阅读器将返回; 没有转换DBNullint?,并且空合并运算符无法识别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没有注释时返回空列表或空引用,则可以避免所有这些.