Всем приятного времени суток.
Занимаясь одним проектом, я наткнулся и споткнулся ободин баг одну особенность, из-за которой я потратил некоторое кол-во нервов и времени. А заключается она в следующем, допустим у нас есть некоторое консольное приложение (абсолютно надуманное и отражающее суть) состоящее из ClassToCreate.cs
и Program.cs:
Вы может скажете, что тут нет него особенного, и вы знаете что будет результатом выполнения программы. Я проверил на .Net Framework 2.0, 3.0, 3.5 и результат был везде одинаково интересный. Что же там такого интересного, спросите вы, давайте посмотрим на результат работы приложения:
Нас интересуют строки, в которых есть EmumVal. По всей логике вещей, должен был быть вызван метод с сигнатурой public ClassToCreate(object obj) а на самом деле среда считает что она лучше знает что и к какому типу привести, и приводит к этому типу. В результате вызывается не тот метод.
И что бы не заканчивать на полуслове я провел еще один эксперимент, так же и вы можете попробовать его провести. для этого добавим
и запустите это дело. Результат превосходит все ожидания!
Занимаясь одним проектом, я наткнулся и споткнулся об
using System;
namespace EnumBugApplication
{
public enum MyEnum
{
EmumVal = 0
}
public class ClassToCreate
{
public ClassToCreate(object obj)
{
Console.WriteLine("Ob :" + obj);
}
public ClassToCreate(MyEnum en)
{
Console.WriteLine("En :" + en);
}
public void ma(object obj)
{
Console.WriteLine("mOb :" + obj);
}
public void ma(MyEnum en)
{
Console.WriteLine("mEn :" + en);
}
public void Methods()
{
Console.WriteLine("const");
ma(-1);
ma(0);
ma(1);
Console.WriteLine("var");
int i = -1;
ma(i++);
ma(i++);
ma(i++);
}
}
}
и Program.cs:
using System;
namespace EnumBugApplication
{
class Program
{
static void Main(string[] args)
{
ClassToCreate ctc;
Console.WriteLine("const");
new ClassToCreate(-1);
new ClassToCreate(0);
new ClassToCreate(1);
new ClassToCreate(0);
Console.WriteLine("var");
int i = -1;
new ClassToCreate(i++);
new ClassToCreate(i++);
ctc = new ClassToCreate(i++);
ctc.Methods();
Console.ReadLine();
}
}
}
Вы может скажете, что тут нет него особенного, и вы знаете что будет результатом выполнения программы. Я проверил на .Net Framework 2.0, 3.0, 3.5 и результат был везде одинаково интересный. Что же там такого интересного, спросите вы, давайте посмотрим на результат работы приложения:
const
Ob :-1
En :EmumVal
Ob :1
En :EmumVal
var
Ob :-1
Ob :0
Ob :1
const
mOb :-1
mEn :EmumVal
mOb :1
var
mOb :-1
mOb :0
mOb :1
Нас интересуют строки, в которых есть EmumVal. По всей логике вещей, должен был быть вызван метод с сигнатурой public ClassToCreate(object obj) а на самом деле среда считает что она лучше знает что и к какому типу привести, и приводит к этому типу. В результате вызывается не тот метод.
И что бы не заканчивать на полуслове я провел еще один эксперимент, так же и вы можете попробовать его провести. для этого добавим
//новый энумератор
public enum MyEnum2
{
EmumVal = 0
}
//дополнительный конструктор
public ClassToCreate(MyEnum en)
{
Console.WriteLine("En :" + en);
}
и запустите это дело. Результат превосходит все ожидания!