Как стать автором
Обновить

Я компьютер — ты дурак или я знаю что тебе нужно

Всем приятного времени суток.

Занимаясь одним проектом, я наткнулся и споткнулся об один баг одну особенность, из-за которой я потратил некоторое кол-во нервов и времени. А заключается она в следующем, допустим у нас есть некоторое консольное приложение (абсолютно надуманное и отражающее суть) состоящее из ClassToCreate.cs

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);
}



и запустите это дело. Результат превосходит все ожидания!
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.