Здравствуйте, Serginio1, Вы писали:
V>>Движется к более безопасному и более удобному такому общению.
V>>Де-факто ни одной новой задачи нововведения языка в этой области решать не позволяют, они позволяют более удобно решать старые задачи.
S>А какие новые задачи?
Например, позволить unamanaged-указателям быть аргументами генериков.
Сейчас для того же самого приходится вводить некий прокси-тип:
readonly struct Pointer<T> where T : unmanaged {
public T * Value;
public Pointer(T * ptr) => Value = ptr;
}
[StructLayout(LayoutKind.Explicit)]
struct SomeUnion<T1, T2, T3>
where T1: unmanaged
where T2: unmanaged
where T3: unmanaged
{
Type _desc;
[FieldOffset(0)] T1 u1;
[FieldOffset(0)] T2 u2;
[FieldOffset(0)] T3 u3;
internal static ref GetRef<T> (ref @this) {
if(typeof(T) != _desc) throw new InvalidOperationException("Blah-blah-blah");
return Unsafe.As<T1, T>(ref @this.u1);
}
public void Extract<T>(ref T extractor) where T : IUnionExtractor<T1, T2, T3> {
}
...
}
public static class SomeUnionExt {
public T Get<T, T1, T2, T3> (ref this SomeUnion<T1, T2, T3> @this) where ... => SomeUnion<T1, T2, T3>.GetRef<T>(@this);
public ref T GetRef<T, T1, T2, T3> (ref this SomeUnion<T1, T2, T3> @this) where ... => ref SomeUnion<T1, T2, T3>.GetRef<T>(@this);
...
SomeUnion<Pointer<byte>, int, IntPtr> u = ...;
Еще момент — статическая линковка нейтивного кода.
Каким-то образом (по крайней мере в .Net Framework так было) они собирают свои либы так, что некоторая функциональность только объявляется на стороне дотнета, но реализуется унутре.