(Per informazioni sul nuovo helper di eccezioni in Visual Studio 2017, vedere la fine di questa risposta)
Considera questo codice:
String s = null;
Console.WriteLine(s.Length);
Questo lancerà un NullReferenceExceptionnella seconda riga e vuoi sapere perché .NET non ti dice che lo eras che era nulla quando è stata lanciata l'eccezione.
Per capire perché non ottieni quell'informazione dovresti ricordare che non è l'origine C # che viene eseguita ma piuttosto IL:
IL_0001: ldnull
IL_0002: stloc.0 // s
IL_0003: ldloc.0 // s
IL_0004: callvirt System.String.get_Length
IL_0009: chiama System.Console.WriteLine
È il callvirtcodice operativo che lancia il NullReferenceExceptione lo fa quando il primo argomento sullo stack di valutazione è un riferimento nullo (quello che è stato caricato utilizzando ldloc.0).
Se .NET dovesse essere in grado di dire che si trattava di sun riferimento nullo, dovrebbe in qualche modo tenere traccia che il primo argomento nello stack di valutazione ha avuto origine dal modulo s. In questo caso è facile per noi vedere che è snullo, ma cosa succederebbe se il valore fosse un valore restituito da un'altra chiamata di funzione e non memorizzato in alcuna variabile? Ad ogni modo, questo tipo di informazioni non è ciò di cui vuoi tenere traccia in una macchina virtuale come la macchina virtuale .NET.
Per evitare questo problema ti suggerisco di eseguire il controllo null degli argomenti in tutte le chiamate ai metodi pubblici (a meno che, ovviamente, non permetti il riferimento null):
public void Foo(String s) {
if (s == null)
throw new ArgumentNullException("s");
Console.WriteLine(s.Length);
}
Se al metodo viene passato null, si ottiene un'eccezione che descrive con precisione qual è il problema (ovvero snull).
Quattro anni dopo, Visual Studio 2017 ha ora un nuovo helper per le eccezioni che proverà a indicare cosa è null quando NullReferenceExceptionviene generato un. È anche in grado di darti le informazioni richieste quando è il valore di ritorno di un metodo che è nullo:

Nota che questo funziona solo in una build DEBUG.