空组合框的项目是null吗?

时间:2012-12-23 23:32:09

标签: c# combobox null resharper nullreferenceexception

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);
. . .

我不明白 - 除非null ==空,否则组合框的项目怎么可能为null?如果null ==为空,那么这就是他们[s,w]在调用此代码时应该是什么。

3 个答案:

答案 0 :(得分:4)

我认为Resharper在这里是错误的,因为Items的{​​{1}}集合似乎是由其构造函数初始化的。那就是:

ComboBox

保证没问题。

此处只有ComboBox c = new ComboBox(); c.Items.Add("1"); 访问者可用,因此没有人可以将此集合替换为另一个(或get)。虽然我不太确定,如果有可能影响这个集合,同时从null派生(我一下子找不到smth),我想即便如此,它仍然保证不会为空。

答案 1 :(得分:3)

Null不为空。

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

  

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

中的XML文件中指定属性      

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

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

相关

答案 2 :(得分:0)

我宁愿用这种方式。

foreach (var item in cmbxColor1.Items)
{
    if (cmbxColor2.Items.Count > 0)
    {
        cmbxColor2.Items.Add(item);
    }
}