Кажется, код на 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