Недавно мы столкнулись со странной проблемой в нашем коде продукта.При отладке мы получили 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)
, чтобы пропустить эту проверку.Странно то, что в строковом присваивании возникает исключение, что, очевидно, бессмысленно, но даже после повторной компиляции оно остается прежним.
Я проверил это с VS2017 и VS 2010 в DEBUG-build.
Конечно, мы можем просто избежать этого, объявив tempCurrentNumberPrefix
перед проверкой.Однако я не понимаю, почему это необходимо.
РЕДАКТИРОВАТЬ: кажется, что значение Execute
не имеет смысла, даже если оно равно true
, и мы перешагиваем через проверку, мы получаем точно такое же поведение.