Recently I decompiled some code and the behaviour of the compiled code differed from the original program.
So I think there might be a bug somewhere.
In a simple program I tried to reproduce the problem.
The decompiled code looked something like this:
static void Main(string[] args)
{
Predicate<DataClass> p = null;
List<DataClass> l = new List<DataClass>();
l.Add(new DataClass("key1", "value1"));
l.Add(new DataClass("key2", "value2"));
l.Add(new DataClass("key3", "value3"));
l.Add(new DataClass("key4", "value4"));
for (int i = 1; i <= 4; i++)
{
string s = "key" + i.ToString();
if (p == null)
{
p = delegate(DataClass dc)
{
return dc.Key==s;
};
}
Console.WriteLine(l.Find(p).Value);
}
}
This code shows four times value1.
It should show four different values.
The problem van be solved in two different ways:
1) Remove the check if (p==null)
The following code works correct:
static void Main(string[] args)
{
Predicate<DataClass> p = null;
List<DataClass> l = new List<DataClass>();
l.Add(new DataClass("key1", "value1"));
l.Add(new DataClass("key2", "value2"));
l.Add(new DataClass("key3", "value3"));
l.Add(new DataClass("key4", "value4"));
for (int i = 1; i <= 4; i++)
{
string s = "key" + i.ToString();
p = delegate(DataClass dc)
{
return dc.Key==s;
};
Console.WriteLine(l.Find(p).Value);
}
}
2) Declare s on the same level as p:
The following code also works correct:
static void Main(string[] args)
{
Predicate<DataClass> p = null;
List<DataClass> l = new List<DataClass>();
l.Add(new DataClass("key1", "value1"));
l.Add(new DataClass("key2", "value2"));
l.Add(new DataClass("key3", "value3"));
l.Add(new DataClass("key4", "value4"));
string s;
for (int i = 1; i <= 4; i++)
{
s = "key" + i.ToString();
if (p == null)
{
p = delegate(DataClass dc)
{
return dc.Key==s;
};
}
Console.WriteLine(l.Find(p).Value);
}
}
So I think there might be a bug somewhere.
In a simple program I tried to reproduce the problem.
The decompiled code looked something like this:
static void Main(string[] args)
{
Predicate<DataClass> p = null;
List<DataClass> l = new List<DataClass>();
l.Add(new DataClass("key1", "value1"));
l.Add(new DataClass("key2", "value2"));
l.Add(new DataClass("key3", "value3"));
l.Add(new DataClass("key4", "value4"));
for (int i = 1; i <= 4; i++)
{
string s = "key" + i.ToString();
if (p == null)
{
p = delegate(DataClass dc)
{
return dc.Key==s;
};
}
Console.WriteLine(l.Find(p).Value);
}
}
This code shows four times value1.
It should show four different values.
The problem van be solved in two different ways:
1) Remove the check if (p==null)
The following code works correct:
static void Main(string[] args)
{
Predicate<DataClass> p = null;
List<DataClass> l = new List<DataClass>();
l.Add(new DataClass("key1", "value1"));
l.Add(new DataClass("key2", "value2"));
l.Add(new DataClass("key3", "value3"));
l.Add(new DataClass("key4", "value4"));
for (int i = 1; i <= 4; i++)
{
string s = "key" + i.ToString();
p = delegate(DataClass dc)
{
return dc.Key==s;
};
Console.WriteLine(l.Find(p).Value);
}
}
2) Declare s on the same level as p:
The following code also works correct:
static void Main(string[] args)
{
Predicate<DataClass> p = null;
List<DataClass> l = new List<DataClass>();
l.Add(new DataClass("key1", "value1"));
l.Add(new DataClass("key2", "value2"));
l.Add(new DataClass("key3", "value3"));
l.Add(new DataClass("key4", "value4"));
string s;
for (int i = 1; i <= 4; i++)
{
s = "key" + i.ToString();
if (p == null)
{
p = delegate(DataClass dc)
{
return dc.Key==s;
};
}
Console.WriteLine(l.Find(p).Value);
}
}