Резьба вполне может быть причиной, но в нашем случае это была красная сельдь. Вы также можете казаться иметь эту проблему, если у вас есть Release build , где была встроена функция. Посмотрите на это repro:
class Program
{
static string someKey = null;
static void Main(string[] args)
{
try
{
object thing;
if (SomeSeeminglyUnrelatedFunction(someKey, out thing)) Console.WriteLine("Found");
things.TryGetValue(someKey, out thing);
}
catch (Exception ex)
{
Console.WriteLine(ex.StackTrace.ToString());
throw;
}
Console.ReadKey();
}
private static Dictionary<string, object> stuff = new Dictionary<string, object>();
private static Dictionary<string, object> things = new Dictionary<string, object>();
private static bool SomeSeeminglyUnrelatedFunction(string key, out object item)
{
return stuff.TryGetValue(key, out item);
}
}
На моей машине это дает следующее Отладочная сборка трассировка стека:
at System.Collections.Generic.Dictionary`2.FindEntry(TKey key)
at System.Collections.Generic.Dictionary`2.TryGetValue(TKey key, TValue& value)
at MyApp.Program.SomeSeeminglyUnrelatedFunction(String key, Object& item)
at MyApp.Program.Main(String[] args)
Но , он дает эту трассировку стека в Выпуск сборки :
at System.Collections.Generic.Dictionary`2.FindEntry(TKey key)
at System.Collections.Generic.Dictionary`2.TryGetValue(TKey key, TValue& value)
at MyApp.Program.Main(String[] args)
При последней трассировке стека возникнет искушение подумать, что имеет , равное things.TryGetValue
, что вызывает исключение, хотя на самом деле это была SomeSeeminglyUnrelatedFunction
функция, встроенная в Main
.
Так что, если вы приземлитесь здесь, пожалуйста, подумайте, есть ли у вас похожая проблема. (Я понимаю, что это не может быть прямым ответом на вопрос ОП, но тем не менее хотел бы поделиться, поскольку это может помочь будущему посетителю.)