以下代码为何或如何工作:
myPerson.petProp
假设myPerson.petProp = myPet
都是只读属性,并且它也是赋值运算符?
据我所知,此语法在var mail = new MailMessage
{
To = { "hello@abc.com" }
};
上触发了MailMessage.To
方法,但是我找不到解释Add
的神奇方法的文档,或者它是否与之相关到它派生的MailAddressCollection
类型或它继承的接口。
为表明上述语法有不同的处理方式,以下方法会给出编译时错误,并抱怨MailAddressCollection
属性为只读:
Collection<T>
我确定还有其他类型的初始化示例,但是To
是我第一次遇到它。
答案 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");
Q2。为什么以下代码不起作用?
A2。
Attempt1 - you can't assign a string to a collection
Attempt2 - the property is read-only
Attempt3 - the property is read-only