调试外部调用的Lambda表达式

时间:2014-01-08 20:09:01

标签: c# debugging visual-studio-2012

我正在调试这行代码:

var myDict = myEnumerable.ToDictionary(k => k.NumericValue, v => v.Display());

我得到ArgumentException (An item with the same key has already been added)

VS2012似乎无法提供有关k.NumericValue导致重复密钥的值的见解。

我当然可以通过编写一些额外的调试代码来解决这个问题,以获得重复的密钥,但有没有办法直接从调试器获取?

2 个答案:

答案 0 :(得分:2)

你不会有ToDictionary的符号信息,我更怀疑.NET BCL是在调试模式下编译的......所以没有。

当然,如果您编写自己的ToDictionary实现,您可以提供异常中的信息,或者能够在信息可用的位置中断。

虽然在技术上可能检查各种内存状态以试图确定在该程序运行时密钥是什么,但是更容易改变代码而是诊断这个问题。

答案 1 :(得分:0)

Servy的回答对我提出的问题是正确的。

解决方案是编写自定义代码进行调试。这是我写的一个扩展方法,作为ToDictionary()的替代品,它抛出了一个更有意义的异常。随意编辑和改进。

public static Dictionary<K,V> ToDictionaryDbg<T,K,V>(this IEnumerable<T> source, Func<T,K> key, Func<T,V> value)
{
    if (source == null) return null;

    Dictionary<K, V> result = new Dictionary<K, V>();

    foreach (var element in source)
    {
        K k = default(K);
        V v = default(V);

        try
        {
            k = key(element);
            v = value(element);
            result.Add(k, v);
        }
        catch (ArgumentException aex)
        {
            throw new ArgumentException("Could not add element with key " + k + ". See inner exception.", aex);
        }
    }

    return result;
}