为什么我的静态隐式运算符抱怨在一个 class 而不是另一个中没有 body

why do my static implicit operators complain there is no body in one class and not another

我正在尝试序列化 MailMessage objects。为此,之前的开发人员实现了 SerializableMailMessage class(如下所示)。

为了修复一些错误,我将二进制 Iformatter 更改为 json Iformatter。 Json 与 NameValueCollections 有一些问题,所以我需要创建一个新的 serializableMailMessage 来处理转换。

这就是问题所在。如果我将下面的代码复制并粘贴到一个新的 class,并且不做任何更改,突然之间,2 个 public 静态隐式运算符开始抱怨他们需要一个 body,因为它们是未标记为 abstract 、 extern 或 partial。

如果我给他们 body 例如

 public static implicit operator MailMessage(SerializableMailMessage message){}; 

然后他们需要一个 return 值。我能想到的唯一值 returning 是消息,但这会创建一个 WhosebugException。

有人可以向我解释一下这里可能发生的事情吗? 为什么在下面的代码中没有 body 可以,但在相同的 class 中却不行?我该如何解决这个问题?

using System.Collections.Specialized;
using System.Net.Mail;
using System.Text;

namespace S22.Mail
{
    //
    // Summary:
    //     A serializable replication of the MailMessage class of the System.Net.Mail namespace.
    //     It implements conversion operators to allow for implicit conversion between SerializableMailMessage
    //     and MailMessage objects.
    public class SerializableMailMessage
    {
        public SerializableAlternateViewCollection AlternateViews { get; }
        public SerializableAttachmentCollection Attachments { get; }
        public SerializableMailAddressCollection Bcc { get; }
        public string Body { get; set; }
        public Encoding BodyEncoding { get; set; }
        public SerializableMailAddressCollection CC { get; }
        public DeliveryNotificationOptions DeliveryNotificationOptions { get; set; }
        public SerializableMailAddress From { get; set; }
        public NameValueCollection Headers { get; }
        public Encoding HeadersEncoding { get; set; }
        public bool IsBodyHtml { get; set; }
        public MailPriority Priority { get; set; }
        public SerializableMailAddress ReplyTo { get; set; }
        public SerializableMailAddressCollection ReplyToList { get; }
        public SerializableMailAddress Sender { get; set; }
        public string Subject { get; set; }
        public Encoding SubjectEncoding { get; set; }
        public SerializableMailAddressCollection To { get; }

        public static implicit operator SerializableMailMessage(MailMessage message);
        public static implicit operator MailMessage(SerializableMailMessage message);
    }
}

显然 non-abstract 方法需要 body,而具有 return 类型的 non-abstract 方法(例如转换运算符)确实需要 return 来自 body.

的东西

您正在从元数据视图 (Go To Definition / F12) 查看 class,它不显示方法体,仅显示 class 成员的签名。

由此我们可以得出结论,您正在查看的实际类型是在另一个程序集中定义的,并且确实为两个运算符提供了主体,确实 return 一个值。

您在这里看到的只是实际代码,只是元数据。

隐式运算符应该根据方法名称中指定的类型转换传递给参数的值,return它。

请参阅此 link 了解说明 https://msdn.microsoft.com/en-gb/library/85w54y0a.aspx