2014-01-26 3 views
0

Я добавляю новый универсальный метод Serialize для моего класса Serializer. И старый должен быть устаревшим.ObsoleteAttribute и общие методы

[XmlRoot("a")] 
public class A 
{ 
    [XmlElement("field")] 
    public string Field; 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     A a = new A(); 
     a.Field = "filed value"; 

     Console.WriteLine(Serialize(a));//this calls generic version !? 
     Console.WriteLine(); 
     Console.WriteLine(Serialize(null));//ok 
     Console.WriteLine(); 
     Console.WriteLine(Serialize<A>(a));//ok, we explicitly called generic version 
    } 

    [Obsolete("Use Serialize<T> instead")] 
    public static string Serialize(Object pObject) 
    { 
     return "You have called old Serialize method"; 
    } 

    public static string Serialize<T>(T value) 
    { 
     return "You have called new Serialize<T> method"; 
    } 
} 

Ожидаемый результат должен быть:

You have called old Serialize method 

You have called old Serialize method 

You have called new Serialize<T> method 

Но результат:

You have called new Serialize<T> method 

You have called old Serialize method 

You have called new Serialize<T> method 

Так почему Serialize (а) называет общую версию? Есть ли ошибка для общих устаревших методов?

+0

Эти типы [выведены во время компиляции] (http://stackoverflow.com/a/4976972/11683). – GSerg

+0

Правила разрешения перегрузки могут быть немного непрозрачными. Но это ясно, это действительно способствует * точному * совпадению с типом аргумента над преобразованием в Object. –

+0

:/Кажется, нам нужно изменить имя метода .. Или переместить его в другое пространство имен. –

ответ

1

Если вы разыгрываете a к object вы получите ожидаемый результат

Console.WriteLine(Serialize((object)a)) 
+0

ну, хорошо, но мы не хотим менять код. с помощью старого кода есть тысячи блоков кода. –

+0

@burcakbas Но вы хотите, чтобы старый код вызывал новую версию, не так ли? Ваше сообщение в атрибуте предполагает, что просто вызов общей версии является правильным. В этом случае вам не нужно менять старый код, вам просто нужно его перекомпилировать. – hvd

+0

@hvd Нет, я не хочу этого. Потому что в новой есть несколько новых вещей, которые вызывают побочные эффекты для нашей бизнес-логики. Я просто хочу предупредить разработчика, как «хорошо, вы можете использовать старый код, но это устарело. Если вы можете, перейдите на новый.» –

Смежные вопросы