Кажется, код на c # оптимизирован неверным образом, так что значение объекта становится нулевым

У меня есть следующий код, который показывает странную проблему:

var all = new FeatureService().FindAll();
System.Diagnostics.Debug.Assert(all != null, "FindAll must not return null");
System.Diagnostics.Debug.WriteLine(all.ToString()); // throws NullReferenceException

Подпись метода FindAll:

public List<FeatureModel> FindAll()

Пройдя по коду, я подтвердил, что возвращаемое значение из FindAll не является нулевым, и, как вы можете видеть из Assert, переменная «all» не является нулевой, но в следующей строке она выглядит как нулевая.

Эта проблема не связана с ошибкой при вызове метода ToString (). Я упростил это до этого воспроизводимого примера, пытаясь отследить основную причину.

Это может быть подсказкой: в отладчике переменная «all» появляется в окне «Locals» со значением «Не удается получить значение local или аргумент« all », поскольку она недоступна в этом указателе инструкций, возможно, потому что она была оптимизирован прочь ".

Я подумал о том, чтобы испробовать один из подходов, документированных где-то еще, для отключения оптимизации кода, но это не решило бы проблему, так как версия выпуска кода все еще будет оптимизирована.

Я использую Visual Studio 2010 с .NET 4.0.

Какие-нибудь мысли?

ОБНОВЛЕНИЕ: по запросу, вот весь метод:

protected override List<FeatureModel> GetModels() {
    var all = new FeatureService().FindAll();
    var wr = new WeakReference(all);
    System.Diagnostics.Debug.Assert(all != null, "FindAll must not return null");
    System.Diagnostics.Debug.WriteLine(wr.IsAlive);
    System.Diagnostics.Debug.WriteLine(all.ToString()); // throws NullReferenceException
    return all;
}

Как к сведению, оригинальная реализация была просто:

protected override List<FeatureModel> GetModels() {
    return new FeatureService().FindAll();
}

Первоначально я столкнулся с нулевым исключением в вызывающем методе. Код, который я разместил, был после отслеживания проблемы в течение некоторого времени.

ОБНОВЛЕНИЕ № 2: По запросу, здесь трассировка стека от исключения:

 at FeatureCrowd.DomainModel.FeatureSearch.GetModels() in C:\Users\Gary\Documents\Visual Studio 2010\Projects\FeatureCrowd\FeatureCrowd.DomainModel\FeatureSearch.cs:line 32
 at FeatureCrowd.DomainModel.FeatureSearch.CreateIndex() in C:\Users\Gary\Documents\Visual Studio 2010\Projects\FeatureCrowd\FeatureCrowd.DomainModel\FeatureSearch.cs:line 42
 at FeatureCrowd.DomainModel.FeatureService.CreateSearchIndex() in C:\Users\Gary\Documents\Visual Studio 2010\Projects\FeatureCrowd\FeatureCrowd.DomainModel\FeatureService.cs:line 100
 at Website.MvcApplication.BuildLuceneIndexThread(Object sender) in C:\Users\Gary\Documents\Visual Studio 2010\Projects\FeatureCrowd\FeatureCrowd.Website\Global.asax.cs:line 50
 at Website.MvcApplication.Application_Start() in C:\Users\Gary\Documents\Visual Studio 2010\Projects\FeatureCrowd\FeatureCrowd.Website\Global.asax.cs:line 61

Ответы на вопрос(4)

Ваш ответ на вопрос