У меня есть следующий код, который вызывает странную проблему:
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 не равно null, и, как вы можете видеть из Assert, переменная "all" не является нулевой, но в следующей строке она выглядит пустой.
Проблема не связана с ошибкой при вызове метода ToString(). Я упростил его до этого воспроизводимого примера, пытаясь проследить основную причину.
Это может быть ключ: в отладчике переменная "все" появляется в окне "Локали" со значением "Невозможно получить значение локального или аргумента" все ", поскольку оно недоступно в этом указателе инструкции, возможно, потому что он был оптимизирован".
Я рассмотрел попытку одного из подходов, задокументированных в другом месте для отключения оптимизации кода, но это не решило бы проблему, поскольку версия версии кода будет по-прежнему оптимизирована.
Я использую Visual Studio 2010 с .NET 4.0.
Любые мысли?
UPDATE: для каждого запроса, вот весь метод:
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;
}
Как FYI, первоначальная реализация была просто:
protected override List<FeatureModel> GetModels() {
return new FeatureService().FindAll();
}
Я первоначально столкнулся с нулевым исключением в вызывающем методе. Код, который я опубликовал, после некоторого времени отслеживал проблему.
UPDATE # 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