using System; using System.Collections.Generic; public interface CovariantInterface { } public interface ContravariantInterface { } public interface InvariantInterface { } public interface MixedInterface { } public class Base { } public class Derived : Base { } public class C { public void M() { string[] stringArray = []; string[][] stringArrayArray = []; string[,] stringArray2D = new string[0, 0]; Span stringSpan = stringArray; // string[] -> Span; // Assignments are included to illustrate that it compiles. // Only the use of the types matter in terms of test output. // Covariant conversions to ReadOnlySpan ReadOnlySpan> covariantInterfaceBaseReadOnlySpan; ReadOnlySpan> covariantInterfaceDerivedReadOnlySpan = default; Span> covariantInterfaceDerivedSpan = default; CovariantInterface[] covariantInterfaceDerivedArray = []; covariantInterfaceBaseReadOnlySpan = covariantInterfaceDerivedReadOnlySpan; // ReadOnlySpan> -> ReadOnlySpan> covariantInterfaceBaseReadOnlySpan = covariantInterfaceDerivedSpan; // Span> -> ReadOnlySpan> covariantInterfaceBaseReadOnlySpan = covariantInterfaceDerivedArray; // CovariantInterface[] -> ReadOnlySpan> // Identify conversions to ReadOnlySpan ReadOnlySpan stringReadOnlySpan; stringReadOnlySpan = stringSpan; // Span -> ReadOnlySpan; stringReadOnlySpan = stringArray; // string[] -> ReadOnlySpan; // Contravariant conversions to ReadOnlySpan ReadOnlySpan> contravariantInterfaceDerivedReadOnlySpan; ReadOnlySpan> contravariantInterfaceBaseReadOnlySpan = default; Span> contravariantInterfaceBaseSpan = default; ContravariantInterface[] contravariantInterfaceBaseArray = []; contravariantInterfaceDerivedReadOnlySpan = contravariantInterfaceBaseReadOnlySpan; // ReadOnlySpan> -> ReadOnlySpan> contravariantInterfaceDerivedReadOnlySpan = contravariantInterfaceBaseSpan; // Span> -> ReadOnlySpan> contravariantInterfaceDerivedReadOnlySpan = contravariantInterfaceBaseArray; // ContravariantInterface[] -> ReadOnlySpan> // Mixed variance conversions to ReadOnlySpan ReadOnlySpan> mixedInterfaceBaseReadOnlySpan; ReadOnlySpan> mixedInterfaceDerivedReadOnlySpan = default; Span> mixedInterfaceDerivedSpan = default; MixedInterface[] mixedInterfaceDerivedArray = []; mixedInterfaceBaseReadOnlySpan = mixedInterfaceDerivedReadOnlySpan; // ReadOnlySpan> -> ReadOnlySpan> mixedInterfaceBaseReadOnlySpan = mixedInterfaceDerivedSpan; // Span> -> ReadOnlySpan> mixedInterfaceBaseReadOnlySpan = mixedInterfaceDerivedArray; // MixedInterface[] -> ReadOnlySpan> // Convert string to ReadOnlySpan string s = ""; ReadOnlySpan charReadOnlySpan = s; // string -> ReadOnlySpan // Various ref type conversions Derived[] derivedArray = []; ReadOnlySpan baseReadOnlySpan; baseReadOnlySpan = derivedArray; // Derived[] -> ReadOnlySpan ReadOnlySpan objectReadOnlySpan; objectReadOnlySpan = stringArray; // string[] -> ReadOnlySpan byte[][] byteByteArray = []; objectReadOnlySpan = byteByteArray; // byte[][] -> ReadOnlySpan // No conversion possible except for identity. ReadOnlySpan> invariantInterfaceBaseReadOnlySpan; ReadOnlySpan> invariantInterfaceDerivedReadOnlySpan; Span> invariantInterfaceDerivedSpan; InvariantInterface[] invariantInterfaceDerivedArray; } }