Почему адрес может быть добавлен в MailMessage.To с помощью инициализации объекта? - PullRequest
0 голосов
/ 28 сентября 2018

Почему или как работает следующий код:

var mail = new MailMessage
{
    To = { "hello@abc.com" }
};

, учитывая, что оба MailMessage.To - свойство только для чтения и оператор присваивания?

Насколько я могускажем, этот синтаксис вызывает метод Add на MailAddressCollection, но я не могу найти документацию, объясняющую это волшебство для MailAddressCollection, или если он относится либо к типу Collection<T>, который он получает, либо к интерфейсам, которые он используетнаследует.

Чтобы показать, что вышеуказанный синтаксис обрабатывается по-разному, следующие подходы дают ошибки времени компиляции, жалуясь, что свойство To доступно только для чтения:

// Attempt 1

var mail = new MailMessage
{
    To = "hello@abc.com"
};

// Attempt 2

var mail = new MailMessage();
mail.To = { "hello@abc.com" }

// Attempt 3

var mail = new MailMessage
{
    To = new MailAddressCollection()
};

Я уверенСуществуют и другие примеры инициализации такого типа, но MailMessage - это первый раз, когда я с ней столкнулся.

1 Ответ

0 голосов
/ 28 сентября 2018

Давайте попробуем ответить на ваши вопросы по одному

Q1.Почему код ниже работает?

var mail = new MailMessage
{
    To = { "hello@abc.com" }
};

A1.Свойство To по существу является свойством только для чтения, в котором вы можете присваивать значение только во время создания объекта.«Волшебство» доставляется коллекционным инициализатором, который вызывает Add для типов IEnumerable с этим синтаксисом.MailAddressCollection - это Collection<MailAddress>, который, в свою очередь, реализует IEnumerable.

Как вы поняли, этот код практически эквивалентен

var mail = new MailMessage();
mail.To.Add("hello@abc.com");

Документация на https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/object-and-collection-initializers

Q2.Почему не работают следующие коды?

A2.

Attempt1 - you can't assign a string to a collection
Attempt2 - the property is read-only
Attempt3 - the property is read-only
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...