Чтобы понять порядок операций, необходимо помнить, что приведение будет применено к объекту справа, но правила, влияющие на КОГДА его применяют, зависят от MSDN Приоритет оператора и ассоциативность
(Dictionary<String, String>)((Object[])e.Result)[1];
Становится
Object[] cast1 = (Object[]) e.Result;
Операция приведения группируется в категорию "Унарные операторы", которая имеет более низкий приоритет, чем индексатор - [], который находится в категории "Первичные выражения".
В исходной строке - символы () необходимы для приведения: ((Object []) e.Result), потому что индексатор - [] применяется сразу к объекту слева каквысокий приоритет.Без окружения () приведение было бы применено ПОСЛЕ индексатора, и, поскольку e.Result является (скорее всего?) Объектом типа, это не удастся во время компиляции.Без () строка будет выглядеть следующим образом:
(Object[])e.Result[1]
, что недопустимо.
((Object[])e.Result)[1]
гарантирует, что e.Result будет приведен к типу Object [] первым,и затем индексатор используется для доступа к первому элементу.
Второе приведение превращает первый элемент приведенного объекта [] (в моем примере приведение 1) в Словарь
Dictionary<String, String> cast2 = (Dictionary<String, String>) cast1[1];