代码之家  ›  专栏  ›  技术社区  ›  Ayb4btu

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

  •  0
  • Ayb4btu  · 技术社区  · 6 年前

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

    MailMessage.To 是只读属性,并且是赋值运算符?

    据我所知,这种语法会触发 Add 上的方法 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 回复  |  直到 6 年前
        1
  •  4
  •   Migg    6 年前

    让我们试着一次回答一个问题

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

    A1。这个 To 属性本质上是一个只读属性,在该属性中,只能在对象构造期间赋值。“魔力”由集合初始值设定项传递,集合初始值设定项调用 Add 论犯罪类型 IEnumerable 用这种语法。 MailAddressCollection Collection<MailAddress> I可数 .

    正如您所推断的,该代码实际上相当于

    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

    问题2。为什么下列代码不起作用?

    Attempt1 - you can't assign a string to a collection
    Attempt2 - the property is read-only
    Attempt3 - the property is read-only