When I wrote the following snippet for experimenting purposes, it raised the hover-error (see screenshot):
Cannot declare pointer to non-unmanaged type ‘dynamic’
The snippet:
dynamic* pointerToDynamic = &fields;
While the code is clearly not allowed (you cannot take the address of a managed type), it raised with me the question: what is a non-unmanaged type and how is it different to a managed type? Or is it just Visual Studio trying to be funny?

There is a difference between unmanaged and non-managed pointers.A managed pointer is a handle to an object on the managed heap, and AFAIK is available in managed C++ only. It is equivalent of C# reference to an object. Unmanaged pointer, on the other hand, is equivalent of a traditional C-style pointer, i.e. address of a memory location; C# provides unary
&operator,fixedkeyword andunsafecontext for that.You are trying to get a pointer to a managed field (
dynamicis actuallySystem.Objectis disguise), while C# allows pointers to unmanaged objects only, hence the wording: your type is non-unmanaged.A bit more on this here.
Update: to make it more clear, managed C++ supports classic C-style pointers and references. But to keep C++ terminology consistent, they are called unmanaged and managed pointers, correspondingly. C# also supports pointers (explicitly in
unsafecontext) and references (implicitly whenever objects of reference types are involved), but the latter is not called “managed pointers”, they are just references.To sum up: in C++ there are unmanaged and managed pointers, in C# – unmanaged pointers and references.
Hope it makes sense now.