Le truc moche c'est que
byte[] GetBuffer() n'existe pas quand tu cibles le .NET Core, c'est
bool TryGetBuffer(out ArraySegment<byte>), parce qu'un MemoryStream ne laisse pas necessairement acces au buffer (dans les cas (?) ou on le cree sans buffer).
Ce qu'il faut voir ce sont les #if ... #endif. Ce code n'est compile que quand on cible le .NET Core.
(C'est utile de cibler le .NET Core quand on fait du Mono, car le code devient generalement plus rapide)
Quand au
default(ArraySegment<byte>), c'est juste l'initialisation usuelle d'une
struct (Obligatoirement alloue sur la pile, c'est comme ca en C#), tu ne peux pas assigner
null a une
struct, car
null est une "instance" (facon de parler) d'
Object, qui est alloue sur le heap.
https://github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/IO/MemoryStream.cs#L225(Oui, d'apres la source, GetBuffer() est public, mais je vous assure que non, ca compile pas

)
Je pourrais ecrire quelque chose comme #If netcore return ms.TryGetBuffer(...) #else blabla #endif, le soucis c'est que sur le .NET Core ca ne compilera pas, parce que le compilo trouvera l'extension, et la methode membre, et ne saura pas quoi choisir.