为什么要将地址添加到MailMessage.To使用对象初始化?

时间:2018-09-28 01:13:55

标签: c# properties initialization c#-7.0

以下代码为何或如何工作:

myPerson.petProp

假设myPerson.petProp = myPet都是只读属性,并且它也是赋值运算符?

据我所知,此语法在var mail = new MailMessage { To = { "hello@abc.com" } }; 上触发了MailMessage.To方法,但是我找不到解释Add的神奇方法的文档,或者它是否与之相关到它派生的MailAddressCollection类型或它继承的接口。

为表明上述语法有不同的处理方式,以下方法会给出编译时错误,并抱怨MailAddressCollection属性为只读:

Collection<T>

我确定还有其他类型的初始化示例,但是To是我第一次遇到它。

1 个答案:

答案 0 :(得分:4)

让我们一次回答您的问题

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