Передать null как ref int

Смотрю описание Interlocked.Increment. Сигнатура метода:

public static int Increment (ref int location);

А вот дальше написано:

Исключения
NullReferenceException
Адрес location является указателем null.

Что-то я не понимаю, что надо передать в качестве аргумента, чтобы значение адреса оказалось null. Это вообще возможно на C#? Как?


Ответы (2 шт):

Автор решения: VladD

Да запросто!

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 и тому подобных штук это, конечно, невозможно.

→ Ссылка
Автор решения: aepot

Вероятно вот так

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.
→ Ссылка