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]在调用此代码时应该是什么。
答案 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。
如果您正在使用外部库(例如
中的XML文件中指定属性mscorlib.dll
),则使用属性为其实体指定合同似乎不可行。输入外部注释。此ReSharper功能允许您使用ReSharper分析引擎使用的属性来补充已编译的实体。外部注释允许您“欺骗”引擎,方法是让它看到编译库时未声明的属性(对于方法,参数和其他声明)。为此,必须在<ReSharper install directory>\Bin\ExternalAnnotations
。安装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);
}
}