Следующий код ведет себя по-разному при построении в режиме деблокирования (или Debug с включенными оптимизациями) и запускает без отладчика Visual Studio.
Он также, похоже, только реплицируется, если используется x86 JITter. Я тестировал это на машине x86, а также работал в WOW64 на машине x64 (установив цель платформы для x86).
Я только пробовал это с .NET 4.0.
При запуске вне отладчика в Release я вижу:
Value is 4
При запуске внутри отладчика часть e.Value.Length
вызова WriteLine
вызывает NullReferenceException
, что я и ожидал.
Код:
namespace Test
{
class UsingReleasable<T>
{
public UsingReleasable(T obj)
{
m_obj = obj;
}
public T Release()
{
T tmp = m_obj;
m_obj = default(T);
return tmp;
}
public T Value
{
get { return m_obj; }
}
T m_obj;
}
class Program
{
static void Main(string[] args)
{
var e = new UsingReleasable<string>("test");
e.Release();
System.Console.WriteLine("Value is {0}", e.Value.Length);
}
}
}
Мой взгляд на сгенерированный код JIT заставляет меня думать, что это ошибка в этой части, но я хотел бы проверить ее дважды, прежде чем перенаправлять это на MS Connect.