我们最近在产品代码中遇到了一个奇怪的问题。调试时,我们得到了一个NullReferenceException
,没想到。
因此我们将其范围缩小到以下MCVE:
using System.Collections.Generic;
using System.Linq;
namespace VSReproCase
{
class Program
{
static void Main(string[] args)
{
ReproCase reproCase = new ReproCase { ExecuteCheck = args.Length > 0 && args[0] == "true" };
reproCase.CheckLaufendeNummer();
}
}
class TestObject
{
public TestObject(string currentNumber)
{
CurrentNumber = currentNumber;
}
public string CurrentNumber { get; set; }
}
class ReproCase
{
public bool ExecuteCheck { get; set; }
public bool CheckLaufendeNummer()
{
bool success = true;
if (ExecuteCheck)
{
string tempCurrentNumberPrefix = "TestObject";
List<TestObject> objectList = new List<TestObject>
{
new TestObject("TestObject1"), new TestObject("TestObject2"),
new TestObject("TestObject3"), new TestObject("TestObject4"),
};
foreach (var testObject in objectList.OfType<TestObject>().Where(x => x.CurrentNumber != null && x.CurrentNumber.StartsWith(tempCurrentNumberPrefix)))
{
success = false;
}
}
return success;
}
}
}
如果ExecuteCheck
返回true
并在false
时运行。但是,当它为false
时不无效,我们跳过if(Execute)
以跳过此检查。奇怪的是,在字符串分配上引发了异常,这显然是毫无意义的,但即使在重新编译后,它仍然保持不变。
我在DEBUG-build中使用VS2017和VS 2010对其进行了检查。
我们当然可以通过在检查之前声明tempCurrentNumberPrefix
来避免这种情况。但是我不明白为什么这样做是必要的。
编辑:Execute
的值似乎是没有意义的,即使它是true
,我们也通过检查来获得完全相同的行为。