Передача другого типа данных в метод, который ожидает другой тип данных - PullRequest
1 голос
/ 24 февраля 2010

С классом XElement его конструктор явно принимает тип XName дая в качестве первого параметра, однако, если я передаю строку, он работает, и я не получаю ошибку времени компиляции.

Что именно здесь происходит, и как я могу реализовать это в своем собственном коде?

Спасибо,

Ответы [ 3 ]

2 голосов
/ 24 февраля 2010

Существует неявное преобразование из строки в XName, в основном. Вот почему это тоже работает:

XName name = "element-name";

Вы можете сделать это с вашими собственными типами, если вы обеспечите соответствующее неявное преобразование - но обычно я не будет делать это. (Обратите внимание, что вы можете обеспечить преобразование либо по типу источника, либо по типу назначения; в данном случае преобразование обеспечивает тип цели (XName), а не тип источника (string).)

LINQ to XML делает все виды интересных вещей с перегрузками операторов и преобразований, которые обычно были бы плохой идеей, но в действительности работают очень хорошо в контексте XML. Мне особенно нравится обработка пространства имен:

XNamespace ns = "some namespace uri";
XName fullName = ns + "element-name";

Еще одна полезная странность - явные преобразования из XAttribute и XElement в различные типы; например, вы можете сделать:

XAttribute attribute = ...;
int? value = (int?) attribute;

Красота обнуляемости здесь в том, что если attribute равно нулю, то и результат будет тоже. Это позволяет очень аккуратно обрабатывать необязательные атрибуты (и элементы).

1 голос
/ 24 февраля 2010

XName имеет специальный определенный неявный оператор . Неявные операторы позволяют выполнять неявные преобразования типов.

0 голосов
/ 24 февраля 2010

XName преобразуется в строку и обратно неявно.

См. MSDN :

XName не содержит общедоступных конструкторов. Вместо этого этот класс обеспечивает неявное преобразование из String, которое позволяет вам создать XName.

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