c # -Code scheint in ungültiger Weise so optimiert zu werden, dass ein Objektwert null wird

Ich habe den folgenden Code, der ein seltsames Problem aufweist:

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

Die Signatur der FindAll-Methode lautet:

public List<FeatureModel> FindAll()

Stepping durch den Code Ich habe bestätigt, dass der Rückgabewert von FindAll nicht null ist, und wie Sie aus dem Assert sehen können, ist die Variable "all" nicht null, aber in der folgenden Zeile scheint sie null zu sein.

Das Problem tritt nicht spezifisch auf, wenn die ToString () - Methode aufgerufen wird. Ich habe es auf dieses reproduzierbare Beispiel vereinfacht, während ich versucht habe, die Grundursache aufzuspüren.

Dies kann ein Hinweis sein: Im Debugger wird die Variable "all" im Fenster "Locals" mit dem Wert "Canot value of local" oder dem Argument "all" angezeigt, da sie bei diesem Befehlszeiger möglicherweise nicht verfügbar ist wurde optimiert. "

Ich habe überlegt, einen der an anderer Stelle dokumentierten Ansätze zum Deaktivieren der Codeoptimierung zu versuchen, aber dies würde das Problem nicht wirklich lösen, da die Release-Version des Codes weiterhin optimiert wird.

Ich verwende Visual Studio 2010 mit .NET 4.0.

Irgendwelche Gedanken?

UPDATE: pro Anfrage, hier ist die gesamte Methode:

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;
}

u Ihrer Information lautete die ursprüngliche Implementierung einfach:

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

Ich bin ursprünglich auf die Null-Ausnahme in der aufrufenden Methode gestoßen. Der Code, den ich gepostet habe, war nach einer Weile, in der ich das Problem nachverfolgt habe.

UPDATE # 2: Hier ist der Stack-Trace der Ausnahme:

 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

Antworten auf die Frage(8)

Ihre Antwort auf die Frage