В первом примере, как сказал pax, копируется сама лямбда - ()=>{Debug.WriteLine("ololo");} - а не "часть" экземпляра класса А.
Во втором ты делаешь замыкание на метод класса, поэтому очевидно, что ссылка на экземпляр есть, сборщик не сможет удалить такой объект.
static void Main()
{
var a = new A();
var b = new B();
a.go(b);
for (int i = 0; i < 10000; i++)
{
var garbage = new byte[1024 * 1024];
GC.Collect();
}
Console.Read();
}
class A
{
public void go(B b)
{
b.setAction(lambda);
}
private void lambda(object e)
{
Debug.WriteLine("ololo");
}
}
class B
{
public delegate void lol(object o);
lol _action;
public void setAction(lol action)
{
_action = action;
}
}
Если поставить точку останова после/на Console.Read(), видно, что оба экземпляра живы.