Передать null как ref int
Смотрю описание Interlocked.Increment. Сигнатура метода:
public static int Increment (ref int location);
А вот дальше написано:
Исключения
NullReferenceException
Адресlocationявляется указателемnull.
Что-то я не понимаю, что надо передать в качестве аргумента, чтобы значение адреса оказалось null. Это вообще возможно на C#? Как?
Ответы (2 шт):
Да запросто!
unsafe
{
int* p = null;
Interlocked.Increment(ref *p);
}
Stack trace в исключении показывает
at System.Threading.Interlocked.Increment(Int32& location)
at TestApp.Program.Main(String[] args) in ...\Program.cs:line 27
— то есть упала именно функция Interlocked.Increment, а не разыменование нулевого указателя.
Ещё один метод, без unsafe-блоков:
Interlocked.Increment(ref Unsafe.NullRef<int>());
Ну а в чистом C#, без интеропа, Marshal и тому подобных штук это, конечно, невозможно.
Вероятно вот так
static unsafe void Main(string[] args)
{
ref int p = ref *(int*)null;
try
{
Interlocked.Increment(ref p);
}
catch (NullReferenceException ex)
{
Console.WriteLine($"{ex.GetType().Name}: {ex.Message}");
}
Console.ReadKey();
}
Вывод в консоль
NullReferenceException: Object reference not set to an instance of an object.