-
Notifications
You must be signed in to change notification settings - Fork 4.2k
Description
Background
The language today allows you to define a method of the form RefStruct M(scoped in T value) which indicates that the in will not be captured in the resulting ref struct which makes code such as the following safe:
public ref struct MyRefStruct
{
private Span<int> _span;
public MyRefStruct(Span<int> x)
{
_span = C.M(x);
}
}
public static class C
{
public static Span<int> M(scoped in Span<int> span)
{
return span;
}
}Likewise, the language allows you to declare extension methods that take a value type T by reference or by readonly reference and so public static Span<int> M(in this Span<int> span) and public static Span<int> M(ref this Span<int> span) are both valid. However, the language does not currently allow you to declare a scoped in extension method and errors for the following: public static Span<int> M(scoped in this Span<int> span). Thus the following code errors:
public ref struct MyRefStruct
{
private Span<int> _span;
public MyRefStruct(Span<int> x)
{
// CS1061: 'Span<int>' does not contain a definition for 'M' and no accessible extension method 'M' accepting a first argument of type 'Span<int>' could be found (are you missing a using directive or an assembly reference?)
_span = x.M();
}
}
public static class C
{
// CS1031: Type expected
// CS1001: Identifier expected
// CS1003: Syntax error, ',' expected
// CS1100: Method 'M' has a parameter modifier 'this' which is not on the first parameter
public static Span<int> M(scoped in this Span<int> span)
{
return span;
}
}However, the new C# 14 extension members feature does allow this and the following works just fine:
public ref struct MyRefStruct
{
private Span<int> _span;
public MyRefStruct(Span<int> x)
{
_span = x.M();
}
}
public static class C
{
extension(scoped in Span<int> span)
{
public Span<int> M()
{
return span;
}
}
}Expected Outcome
After talking with @jaredpar, it is believed that this was likely just an oversight that this doesn't work with the pre-C# 14 extension feature. However, it was noted that there are no tests for scoped in this or extension(scoped in T name) in the codebase and such explicit tests should likely be added (at least for the new C# 14 extension members feature). It may also be worth adding test for extension(scoped ref T name).