33
44public interface CovariantInterface < out T > { }
55
6+ public interface ContravariantInterface < in T > { }
7+
68public interface InvariantInterface < T > { }
79
8- public interface Interface < out T1 , T2 > { }
10+ public interface MixedInterface < out T1 , in T2 > { }
911
1012public class Base { }
1113
@@ -16,14 +18,14 @@ public class C
1618 public void M ( )
1719 {
1820 string [ ] stringArray = [ ] ;
19- string [ ] [ ] stringArrayArray ;
20- string [ , ] stringArray2D ;
21+ string [ ] [ ] stringArrayArray = [ ] ;
22+ string [ , ] stringArray2D = new string [ 0 , 0 ] ;
2123
2224 Span < string > stringSpan = stringArray ; // string[] -> Span<string>;
2325
24- // Covariant conversions to ReadOnlySpan
25- // Assignments are included to illustrate that this compiles.
26+ // Assignments are included to illustrate that it compiles.
2627 // Only the use of the types matter in terms of test output.
28+ // Covariant conversions to ReadOnlySpan
2729 ReadOnlySpan < CovariantInterface < Base > > covariantInterfaceBaseReadOnlySpan ;
2830 ReadOnlySpan < CovariantInterface < Derived > > covariantInterfaceDerivedReadOnlySpan = default ;
2931 Span < CovariantInterface < Derived > > covariantInterfaceDerivedSpan = default ;
@@ -37,18 +39,32 @@ public void M()
3739 stringReadOnlySpan = stringSpan ; // Span<string> -> ReadOnlySpan<string>;
3840 stringReadOnlySpan = stringArray ; // string[] -> ReadOnlySpan<string>;
3941
42+ // Contravariant conversions to ReadOnlySpan
43+ ReadOnlySpan < ContravariantInterface < Derived > > contravariantInterfaceDerivedReadOnlySpan ;
44+ ReadOnlySpan < ContravariantInterface < Base > > contravariantInterfaceBaseReadOnlySpan = default ;
45+ Span < ContravariantInterface < Base > > contravariantInterfaceBaseSpan = default ;
46+ ContravariantInterface < Base > [ ] contravariantInterfaceBaseArray = [ ] ;
47+ contravariantInterfaceDerivedReadOnlySpan = contravariantInterfaceBaseReadOnlySpan ; // ReadOnlySpan<ContravariantInterface<Base>> -> ReadOnlySpan<ContravariantInterface<Derived>>
48+ contravariantInterfaceDerivedReadOnlySpan = contravariantInterfaceBaseSpan ; // Span<ContravariantInterface<Base>> -> ReadOnlySpan<ContravariantInterface<Derived>>
49+ contravariantInterfaceDerivedReadOnlySpan = contravariantInterfaceBaseArray ; // ContravariantInterface<Base>[] -> ReadOnlySpan<ContravariantInterface<Derived>>
50+
51+ // Mixed variance conversions to ReadOnlySpan
52+ ReadOnlySpan < MixedInterface < Base , Derived > > mixedInterfaceBaseReadOnlySpan ;
53+ ReadOnlySpan < MixedInterface < Derived , Base > > mixedInterfaceDerivedReadOnlySpan = default ;
54+ Span < MixedInterface < Derived , Base > > mixedInterfaceDerivedSpan = default ;
55+ MixedInterface < Derived , Base > [ ] mixedInterfaceDerivedArray = [ ] ;
56+ mixedInterfaceBaseReadOnlySpan = mixedInterfaceDerivedReadOnlySpan ; // ReadOnlySpan<MixedInterface<Derived, Base>> -> ReadOnlySpan<MixedInterface<Base, Derived>>
57+ mixedInterfaceBaseReadOnlySpan = mixedInterfaceDerivedSpan ; // Span<MixedInterface<Derived, Base>> -> ReadOnlySpan<MixedInterface<Base, Derived>>
58+ mixedInterfaceBaseReadOnlySpan = mixedInterfaceDerivedArray ; // MixedInterface<Derived, Base>[] -> ReadOnlySpan<MixedInterface<Base, Derived>>
59+
4060 // Convert string to ReadOnlySpan<char>
4161 string s = "" ;
4262 ReadOnlySpan < char > charReadOnlySpan = s ; // string -> ReadOnlySpan<char>
4363
44- // Use the non-covariant interfaces to show that no conversion is possible .
64+ // No conversion possible except for identity .
4565 ReadOnlySpan < InvariantInterface < Base > > invariantInterfaceBaseReadOnlySpan ;
4666 ReadOnlySpan < InvariantInterface < Derived > > invariantInterfaceDerivedReadOnlySpan ;
4767 Span < InvariantInterface < Derived > > invariantInterfaceDerivedSpan ;
4868 InvariantInterface < Derived > [ ] invariantInterfaceDerivedArray ;
49- ReadOnlySpan < Interface < Base , string > > interfaceBaseReadOnlySpan ;
50- ReadOnlySpan < Interface < Derived , string > > interfaceDerivedReadOnlySpan ;
51- Span < Interface < Derived , string > > interfaceDerivedSpan ;
52- Interface < Derived , string > [ ] interfaceDerivedArray ;
5369 }
5470}
0 commit comments