블로그 이미지
kyeongkyun

calendar

      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    

Notice

'.NET'에 해당되는 글 2

  1. 2010/01/18 Enum Type의 버그?(2)
  2. 2008/01/17 .NET Framework 라이브러리 소스 코드 공개
2010/01/18 17:00 .NET

 

지난 주말 고객 사에서 문의를 하나 받게 되었습니다. 문제는 여러 개의 매개변수로 오버로드 된 메서드가 이상 작동을 한다는 것이었습니다. 문제는 Enum 타입의 매개변수에 상수 값 0이 입력되면 문제가 발생을 하는 것입니다.  

다음과 같이 enum이 정의 되어 있고 이 enum을 사용하는 메서드가 있습니다.  

 

public enum MyEnum
{
    A=0, B=1, C=2
}
public class MyClass
{
    public void DoWork(object p1)
    {
             Console.WriteLine("Object 매개변수:{0}", p1);
    } 
    public void DoWork(MyEnum p1)
    {
             Console.WriteLine("MyEnum 매개변수:{0}", p1);
    }
}


MyClass는 DoWork라는 두 개의 메서드를 가지고 있으며 매개변수를 통해 오버로드 되어 있습니다. 사용자는 첫 번째 메서드를 사용하여 int 형식의 값을 전달하고 그 결과를 받으려 했습니다.  


MyClass c = new MyClass();
c.DoWork(1);

 

먼저 상수 1을 매개변수로 전달 했습니다. 예상했던대로 첫번째 object를 매개변수로 받는 DoWrok 메서드가 실행 되었습니다.

 

 

문제는 다음 코드에서 발생하게 됩니다. 상수값 0을 입력해 보았습니다.

 

MyClass c = new MyClass();
c.DoWork(0);

  


 

예상과는 다르게 MyEnum 타입을 매개변수로 받는 DoWork 메서드가 실행 된 것입니다. 분명히 상수값 0을 입력하였으나 컴파일러는 0을 Enum 타입으로 인식하고 두번째 메서드를 실행하게 된 것입니다.  

이 문제는 그다지 많이 알려지진 않았지만 ADO.NET에서 SqlParameter를 생성할때도 발생 할 수 있습니다. SqlParameter에는 다음과 같은 오버로드가 존재 합니다.  

 

SqlParameter(string parameterName, object value)
SqlParameter(string parameterName, System.Data.SqlDbType dbType)

 

만약 첫번째 생성자를 사용할 목적으로 value에 상수값 0을 넣게 되면 0은 enum으로 인식하고 SqlDbType의 0번 값인 BigInt를 반환하게 되는 것입니다.  

제 개인적인 생각으로는 상당히 심각한 문제이나 Microsoft에서도 이미 알고 있고 하위 호환성 때문에 수정하지 않고 있다고 합니다.^^

다음 처럼 C# 명세에도 언급되어 있다는 것을 얼마 전에 알게 되었습니다. 


 


 

이를 해결하기 위해서는 외부 변수에 0을 할당하여 사용을 하거나 오버로드시 메서드의 개수를 달리 하는 방법으로 해결 할 수 있습니다.

크리에이티브 커먼즈 라이선스
Creative Commons License

'.NET' 카테고리의 다른 글

Enum Type의 버그?  (2) 2010/01/18
.NET Framework 라이브러리 소스 코드 공개  (0) 2008/01/17
posted by kyeongkyun(kobukii) kyeongkyun
TAG .NET, enum
2008/01/17 15:51 .NET
오늘부터 .NET Framework 라이브러리의 소스코드를 볼 수 있다고 합니다.

탐색 및 디버깅이 가능한 라이브러리는 아래와 같습니다.
  • .NET Base Class Libraries (including System, System.CodeDom, System.Collections, System.ComponentModel, System.Diagnostics, System.Drawing, System.Globalization, System.IO, System.Net, System.Reflection, System.Runtime, System.Security, System.Text, System.Threading, etc).
  • ASP.NET (System.Web, System.Web.Extensions)
  • Windows Forms (System.Windows.Forms)
  • Windows Presentation Foundation (System.Windows)
  • ADO.NET and XML (System.Data and System.Xml)

참고로 소스코드를 확인 하기 위해서는 Visual Studio 2008이 설치되 있어야 하며 간단한 세팅을 거쳐 코드를 확인할 수 있습니다.

세팅 방법은 Shawn Burke's Blog 에서 확인 할 수 있습니다.

크리에이티브 커먼즈 라이선스
Creative Commons License

'.NET' 카테고리의 다른 글

Enum Type의 버그?  (2) 2010/01/18
.NET Framework 라이브러리 소스 코드 공개  (0) 2008/01/17
posted by kyeongkyun(kobukii) kyeongkyun
prev 1 next