C # мульти кастинг пример - PullRequest
5 голосов
/ 10 февраля 2012

Может ли кто-нибудь написать это буквально для меня, чтобы я мог понять, как проводится кастинг?Количество скобок смущает меня.

(Dictionary<String, String>)((Object[])e.Result)[1];

Был только в поиске простых примеров приведения (возможно, это означает, что я ищу неправильную вещь), которые не очень помогли.

Ответы [ 4 ]

11 голосов
/ 10 февраля 2012

Сначала e.Result приводится к массиву типа Object

(Object[])e.Result

Затем элемент с индексом 1 в этом массиве [1] преобразуется в словарь типа <string, string>

(Dictionary<String, String>)((Object[])e.Result)[1];

Надеюсь, что помог.

4 голосов
/ 10 февраля 2012
Object[] cast1 = (Object[])e.Result;
Object secondElement = cast1 [1];
Dictionary<String, String> cast2 = (Dictionary<String, String>)secondElement;
4 голосов
/ 10 февраля 2012

Чтобы понять порядок операций, необходимо помнить, что приведение будет применено к объекту справа, но правила, влияющие на КОГДА его применяют, зависят от 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];
2 голосов
/ 10 февраля 2012
object[] cast1result = (object[]) e.Result;
object dictionaryElement = cast1result[1];
Dictionary<string, string> cast2result = (Dictionary<string, string>) dictionaryElement;
...