2017-01-24 19 views
0

Я пытаюсь сериализовать MailMessage объектов. Для этого класс SerializableMailMessage был реализован предыдущим разработчиком (показано ниже).Почему мои статические неявные операторы жалуются, что в одном классе нет тела, а не еще

Чтобы исправить ошибки, я перехожу из двоичного файла Iformatter в json Iformatter. У Json есть некоторые проблемы с NameValueCollections, поэтому мне нужно было создать новый serializableMailMessage для обработки преобразования.

Здесь возникает проблема. Если я скопирую и вставляю приведенный ниже код в новый класс и не вношу никаких изменений, внезапно 2 публичных статических неявных оператора начинают жаловаться, что им нужен орган, потому что они не помечены как абстрактные, внешние или частичные.

Если я даю им тело, например.

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

Им нужно вернуть значение. Единственное значение, которое я мог бы подумать о возврате, - это сообщение, но это создает исключение StackOverFlowException.

Может ли кто-нибудь объяснить мне, что здесь может быть? Почему это нормально, если не быть телом в нижнем коде, но не в порядке в одном классе? Как мне обойти проблему?

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); 
    } 
} 
+1

Почему вы думаете, что эти операторы * не * нужно тело? Что вы ожидаете от них, если вы не обеспечиваете реализацию для этих операторов? – Servy

+0

Каким образом MailMessage может быть магическим приложением для Serializablemailmessage или наоборот без тела и возвращаемого значения для операторов? Вам нужно сделать это преобразование внутри этих операторов и вернуть значение конвертированного значения. –

+0

@TimSchmelter Этот код никогда бы не скомпилировался. – Servy

ответ

3

Очевидно, не абстрактные методы должны иметь тело, а не абстрактные методы, которые имеют тип возвращаемого значения (например, операторы преобразования) действительно необходимо вернуть что-то из этого тела.

Вы смотрите на класс из представления метаданных (Go To Definition/F12), который не показывает тела метода, а просто подписи членов класса.

Из этого можно сделать вывод о том, что фактический тип вы смотрите на это определено в другой сборке, и делает обеспечивают органы для обоих операторов, которые делают возвращают значение.

Вы просто не видите фактический код здесь, только метаданные.

+0

Ах, что имеет смысл, спасибо – user2920648

+1

Теперь я знаю, что метаданные не показывают тела методов, я смог быстро отследить репозиторий git класса и просмотреть код в целом. Теперь все имеет смысл, и мое решение работает по назначению. – user2920648

-1

Неявный оператор shoukd преобразует значения, переданные в параметр, и возвращает его в соответствии с типом, указанным в имени метода.

Смотрите эту ссылку для объяснения https://msdn.microsoft.com/en-gb/library/85w54y0a.aspx

+1

И класс - это конструкция, которая позволяет создавать собственные пользовательские типы, группируя переменные других типов, методов и событий. Перефразируя определение MSDN для ключевого слова, касательного к вопросу, не является ответом на вопрос. Попытайтесь прочитать и понять вопрос перед ответом. – CodeCaster