C#6.0 null-coalescing对我来说无法正常工作

时间:2017-07-04 15:40:36

标签: c#

非常简单的问题,下面的代码抛出一个" Nulllable对象必须有一个值"例外。但我以为那??是要处理那个?

<select id = "select1" name = "select1" onchange="change()">
       <option>Select Year...</option>
        <option>January</option>
        <option>February</option>
        <option>March</option>
        <option>April</option>
        <option>May</option>
        <option>June</option>
        <option>July</option>
        <option>August</option>
        <option>September</option>
        <option>October</option>
        <option>November</option>
        <option>December</option>
    </select>
    <select id = "select2" name = "select2" style = "display:none;">

    </select>

5 个答案:

答案 0 :(得分:3)

null ToString() Value属性上调用stop.pallets_qty_total方法后,您正在检查stop.pallets_qty_total上返回的结果null } stop null本身也可能是string qty = (stop?.pallets_qty_total?.ToString()) ?? "0"; ,这也会导致您的代码失败。

您需要使用 Null-Propogation 运算符尝试以下内容:

from pykeepass import PyKeePass

try:
    kp = PyKeePass("info.kdbx", password="12345")
except Exception, e:
    print "Got exception",e

lstEntry = kp.find_entries_by_notes(".*Chocolate.*",regex=True)
print lstEntry
print lstEntry[0].notes

答案 1 :(得分:2)

虽然评论已经给出正确答案,但这里有更详细的解释:

你是对的,??运算符将采用左操作数,它的值不为空。否则它将采用正确的操作数。它是一个简短的版本:

var qty = input == null ? "0" : input;

但是,分配不会抛出异常。调用ToString()

会引发异常

如果您的输入为null,则您的陈述等于以下内容:

var qty = ((object)null).ToString();

这显然会引发NullReferenceException

解决方案:

您正在寻找的是?.运营商。其中说“如果对象不为空则调用函数”。这扩展如下:

input != null ? input.ToString() : null
// is equal to
input?.ToString()

因此,分配的解决方案应该是两个运算符的组合:

var qty = input?.ToString() ?? "0"; 

答案 2 :(得分:1)

当您没有分配值时,您正尝试访问Value][1] Nullable<T>属性。正如规范所说,它将抛出异常:

  

如果尚未将类型T的值分配给Nullable对象,   你可以将它与null进行比较并检索其HasValue属性,但是你   无法访问其Value属性或调用其他成员。

这里有两个选项 - 如果object为null,则使用null-conditional operator来避免访问对象属性:

string qty = stop.pallets_qty_total?.Value.ToString() ?? "0";

或者您可以记住,数字类型的默认值为零。如果nullable没有赋值,则获取默认值:

string qty = stop.pallets_qty_total.GetValueOrDefault().ToString();

这也很小premature performance optimization

答案 3 :(得分:1)

除了Ehsan Sajjad的回答之外,你实际上并不需要第二个pallets_qty_total,假设 string qty = stop?.pallets_qty_total.GetValueOrDefault().ToString(); 是一个整数。您可以改为使用Nullable.GetValueOrDefault(),如下所示:

pallets_qty_total

如果default(T)有值,则会返回它。如果没有,它将返回int,如果是0,则返回{{1}}。

答案 4 :(得分:0)

它只会检查Value是否为null,但如果object为null,则它会抛出异常。

string qty = stop?.pallets_qty_total?.Value.ToString() ?? "0";