2014-01-26 3 views
0

serializer 클래스에 대한 새로운 일반 Serialize 메서드를 추가하고 있습니다. 그리고 오래된 하나는 쓸모가 없어야합니다.ObsoleteAttribute 및 Generic 메서드

You have called old Serialize method 

You have called old Serialize method 

You have called new Serialize<T> method 

그러나 결과는 다음과 같습니다 :

[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 new Serialize<T> method 

You have called old Serialize method 

You have called new Serialize<T> method 

가 왜 직렬화 (a)는 일반 버전을 호출? 더 이상 쓸모없는 일반 메소드에 버그가 있습니까? 당신이 objecta 캐스팅 경우

+0

유형은 [컴파일시에 유추]됩니다 얻을 것이다 (http://stackoverflow.com/a/4976972/11683). – GSerg

+0

과부하 해결 규칙은 약간 불투명 할 수 있습니다. 그러나 이것은 분명합니다. 실제로 Object 로의 변환을 통해 인수 유형과의 정확한 일치를 선호합니다. –

+0

:/우리는 메서드 이름을 변경해야 할 것 같습니다 .. 또는 다른 네임 스페이스로 이동하십시오 .. –

답변

1

하면 예상 된 결과

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

음, 그래도 코드를 변경하고 싶지는 않습니다. 이전 코드를 사용하는 수천 개의 코드 블록이 있습니다. –

+0

@burcakbas하지만 이전 코드에서 새 버전을 호출하기를 원합니다. 그렇습니까? 속성에있는 메시지는 단순히 제네릭 버전을 호출하는 것이 정확하다는 것을 나타냅니다. 이 경우 이전 코드를 변경할 필요가 없으며 다시 컴파일해야합니다. – hvd

+0

@hvd 아니, 나는 그것을 원하지 않는다. 새로운 것에는 몇 가지 새로운 것이 있으며 비즈니스 로직에 부작용을 유발할 수 있습니다. 개발자에게 "ok, 오래된 코드를 사용할 수 있지만 더 이상 쓸모가 없다"는 경고 만하고 싶습니다. 가능한 경우 새 코드로 변경하십시오. " –

관련 문제