Вы выполняете приведение (выполняя (Outlook.Items)oInbox.Items
).Приведение означает, что вы ссылаетесь на объект типа X
как тип Y
.Это допустимо в следующих сценариях:
X
находится в иерархии наследования Y
(это означает, что это либо родительский класс Y
, либо дочерний класс Y
),В случае, когда X
является родительским классом, приведение будет успешным только во время выполнения, если рассматриваемый объект на самом деле равен Y
(или тип, производный от Y
) Y
- это тип интерфейса, который реализуется с помощью X
- Существует явное преобразование, определенное из
X
в Y
Из-за полиморфизма приведениепервый случай обычно не меняет поведение функций (хотя это может произойти, если более производный тип явно скрывает реализацию родителя). Однако я подозреваю, что это ваш сценарий;тип oInbox.Items
- это тип, который наследуется от Outlook.Items
, но скрывает реализацию Outlook.Items.Sort
.При явном приведении к родительскому типу вы обходите новую дочернюю реализацию.Обратите внимание, что этот вид техники работает только тогда, когда дочерний элемент скрывает функцию, а не переопределяет виртуальную функцию) .
Второй случай может изменить поведение, если X
явно реализуетфункция (и) на Y
, которую вы собираетесь использовать.Приведя к интерфейсу, вы явно указываете компилятору, что вы хотите, чтобы он связывал ваш вызов метода с реализацией для интерфейса, а не с обычным общедоступным методом в самом классе.
Третий почтивсегда меняет поведение, так как вы получаете совершенно другой тип (и, следовательно, совершенно другой объект ).
Я не могу говорить о том, к какому из этих случаев относится ваш случай,поскольку у меня нет особого опыта взаимодействия с Office, но это должно ответить на ваш основной вопрос «как они могут отличаться?»