1995Fermer1997
WarptenLe 10/04/2017 à 13:47
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 grin)

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.