지난 주말 고객 사에서 문의를 하나 받게 되었습니다. 문제는 여러 개의 매개변수로 오버로드 된 메서드가 이상 작동을 한다는 것이었습니다. 문제는 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을 할당하여 사용을 하거나 오버로드시 메서드의 개수를 달리 하는 방법으로 해결 할 수 있습니다.
'.NET' 카테고리의 다른 글
| Enum Type의 버그? (2) | 2010/01/18 |
|---|---|
| .NET Framework 라이브러리 소스 코드 공개 (0) | 2008/01/17 |
이올린에 북마크하기
이올린에 추천하기