6

Resharper 希望我更改此代码:

foreach (var item in cmbxColor1.Items)
{
    cmbxColor2.Items.Add(item);
    . . .

...因为它说,“可能的'System.NullReferencesException'”

所以应该是这样的:

foreach (var item in cmbxColor1.Items)
{
    if (null != cmbxColor2.Items)
    {
        cmbxColor2.Items.Add(item);
. . .

?

我不明白 - 组合框的 Items 怎么可能是 null,除非 null == 为空?如果 null == 为空,那么这正是调用此代码时它们 [s,w] 的样子。

4

3 回答 3

4

我想 Resharper 在这里是错误的,因为它的Items集合ComboBox似乎是由它的构造函数初始化的。那是:

ComboBox c = new ComboBox();
c.Items.Add("1");

保证没问题。

这里也只有get访问器可供我们使用,因此没有人可以用另一个(或null)替换这个集合。虽然我不太确定,但如果有可能在派生时影响这个集合ComboBox(我无法立即找到 smth),我想即使那样它仍然保证不为空。

于 2012-12-23T23:44:51.240 回答
3

Null 不为空。

Resharper 团队对许多 .NET 类进行了一些自动代码分析,以确定哪些方法和属性可以返回 null。如果 Resharper 声称它可以为空,那可能是因为有某种方式(也许是模糊的)它实际上可能为空。

如果您使用的是外部库(例如mscorlib.dll),使用属性为其实体指定合同似乎不可行。输入外部注释。此 ReSharper 功能允许您使用 ReSharper 分析引擎使用的属性来补充已编译的实体。外部注解让你“欺骗”引擎,让它看到在编译库时没有声明的属性(用于方法、参数和其他声明)。为此,必须在位于 .xml 的 XML 文件中指定属性<ReSharper install directory>\Bin\ExternalAnnotations

这是安装 ReSharper 时存储在此文件夹中的标准库的合同定义。这些合同是根据源代码分析以及 Microsoft 合同获得的。使用前一种技术获得的合同存储在该类型的文件中*.Generated.xml,而使用后一种技术获得的合同存储在该类型的文件中*.Contracts.xml

但是,我同意这不太可能null在实践中实现。也可能是 Resharper 过于谨慎 - 证明某些东西是否可以为空是一个难题。如果您认为分析错误并想要更正它,您可以修改注释。

有关的

于 2012-12-23T23:41:06.793 回答
0

我宁愿用这种方式。

foreach (var item in cmbxColor1.Items)
{
    if (cmbxColor2.Items.Count > 0)
    {
        cmbxColor2.Items.Add(item);
    }
}
于 2012-12-23T23:36:42.690 回答