C# 是一个组合框';s项为空时为空?

C# 是一个组合框';s项为空时为空?,c#,combobox,null,resharper,nullreferenceexception,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) { cmbx

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==empty,那么当调用这个代码时,它们就是这样的

foreach (var item in cmbxColor1.Items)
{
    if (cmbxColor2.Items.Count > 0)
    {
        cmbxColor2.Items.Add(item);
    }
}
Null不是空的

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

如果您使用的是外部库(例如
mscorlib.dll
),那么使用属性为其实体指定契约似乎是不可行的。输入外部注释。此ReSharper功能允许您使用ReSharper分析引擎使用的属性来补充已编译的实体。外部注释通过让引擎看到在编译库时未声明的属性(用于方法、参数和其他声明),可以“欺骗”引擎。为此,必须在
\Bin\ExternalAnnotations
中的XML文件中指定属性

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

但是,我同意在实践中不太可能是
null
。也可能是Resharper过于谨慎——证明某些东西是否可以为空是一个困难的问题。如果您认为分析是错误的,并且希望更正,则可以修改注释

相关的


我认为Resharper在这里是错误的,因为
组合框的
集合似乎是由其构造函数初始化的。即:

ComboBox c = new ComboBox();
c.Items.Add("1");
保证一切正常


此外,此处仅提供了
get
访问器,因此没有人可以用另一个(或
null
)替换此集合。虽然我不太确定,但如果从
组合框
派生时有可能影响此集合(我无法立即找到smth),我想即使这样,它仍然保证不为空。

系统.Windows.Forms.ComboBox
吗?@TrevorPilley:好问题!从问题历史来看,克莱·香农似乎正在开发一款手机应用程序,所以我猜它不是
System.Windows.Forms
。不过如果能得到OP的确认就好了。这是一个windows应用商店应用程序;那是我的周末计划;工作日我正在开发一套应用程序(一个C#Windows应用商店应用程序和一个Windows phone应用程序)。所以:这是windows-store-app。为什么这样会更好?OP不需要检查物品的数量。建议他检查
cmbxColor2.Items
是否为空,而您的代码在这种情况下会抛出NullReferenceException好的,更正,您是对的并不好,我宁愿使用这种方式。