Словарь <> сообщает о неверном ключе, когда его нет - PullRequest
0 голосов
/ 05 октября 2009

У меня есть некоторый код, который добавляет Func<short> к Dictionary<byte, Func<short>> с индексом 0. Позже, некоторый код в классе, который содержит словарь, пытается извлечь этот Func (через TryGetValue) и выполнить его, вызывая исключение если это не работает. Несмотря на то, что доступ к индексу допустим, он выдает исключение, которое означает, что извлечение функции завершилось неудачно. Почему это? (при необходимости можете предоставить код)

    //processor construction and setup
    VirtualProcessor processor = new VirtualProcessor();
    ...
    processor.InputChannels.Add(0, () => { return 2; });//the func i'm trying to access
    //end processor construction and setup
    //build program
    Dictionary<short, Command> commands = new Dictionary<short, Command>();
    commands.Add(0, CommandFactory.CreateInputCommand(0, 0));//this, in a roundabout way, attempts to call the func
    commands.Add(1, CommandFactory.CreateLoadCommand(1, 200));
    commands.Add(2, CommandFactory.CreateAddCommand(0, 1, 2));
    commands.Add(3, CommandFactory.CreateHaltCommand());
    //end build program
    //execution
    processor.CurrentProgram = commands;
    processor.ExecuteTillHalt();
    //end execution
    Console.ReadLine();

Где-то в пустыне коммутаторов, в другом классе ...

    Func<short> inChannel;
    InputChannels.TryGetValue(command.Data2, out inChannel);//the attempt to access the func, this is the second value supplied to CreateInputCommand above
    if (inChannel != null)
            Registers[command.Data1] = inChannel();//should be here
    else
            throw new InvalidInputChannelException("Invalid input channel " + command.Data2); //throws this

Ответы [ 2 ]

2 голосов
/ 05 октября 2009

Возможно, ошибка в вашем коде - почему вы используете TryGetValue, а затем проверяете значение на ноль? Я бы переписал это как:

if (InputChannels.TryGetValue(command.Data2, out inChannel))
    Registers[command.Data1] = inChannel();
else
    throw ...

Если одна из этих функций возвращает ноль, вы получите результат, который вы описали.

0 голосов
/ 05 октября 2009

Убедитесь, что ваш звонок на CommandFactory.CreateInputCommand никогда не вернется null. В частности, ваш код предполагает, что он возвращает null для следующего вызова:

CommandFactory.CreateInputCommand(0, 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...