Collection expressions: require Add method callable with a single argument for class and struct types that do not use [CollectionBuilder] (#8022)
This commit is contained in:
Родитель
101648ef34
Коммит
c925991a4b
|
@ -110,9 +110,13 @@ An implicit *collection expression conversion* exists from a collection expressi
|
||||||
in which cases the *element type* is `T`
|
in which cases the *element type* is `T`
|
||||||
* A *type* with an appropriate *[create method](#create-methods)* and a corresponding *element type* resulting from that determination
|
* A *type* with an appropriate *[create method](#create-methods)* and a corresponding *element type* resulting from that determination
|
||||||
* A *struct* or *class type* that implements `System.Collections.IEnumerable` where:
|
* A *struct* or *class type* that implements `System.Collections.IEnumerable` where:
|
||||||
* The *type* has an *[applicable](https://github.com/dotnet/csharpstandard/blob/standard-v6/standard/expressions.md#11642-applicable-function-member)* constructor that can be invoked with no arguments, and the constructor is accessible at the location of the collection expression, and
|
* The *type* has an *[applicable](https://github.com/dotnet/csharpstandard/blob/standard-v6/standard/expressions.md#11642-applicable-function-member)* constructor that can be invoked with no arguments, and the constructor is accessible at the location of the collection expression.
|
||||||
* If the collection expression has any elements, the *type* has an *[applicable](https://github.com/dotnet/csharpstandard/blob/standard-v6/standard/expressions.md#11642-applicable-function-member)* instance or extension method `Add` that can be invoked with a single argument of the [*iteration type*](https://github.com/dotnet/csharpstandard/blob/standard-v6/standard/statements.md#1295-the-foreach-statement), and the method is accessible at the location of the collection expression,
|
* If the collection expression has any elements, the *type* has an instance or extension method `Add` where:
|
||||||
in which case the *element type* is the *iteration type* of the *type*.
|
* The method can be invoked with a single value argument.
|
||||||
|
* If the method is generic, the type arguments can be inferred from the collection and argument.
|
||||||
|
* The method is accessible at the location of the collection expression.
|
||||||
|
|
||||||
|
In which case the *element type* is the [*iteration type*](https://github.com/dotnet/csharpstandard/blob/standard-v6/standard/statements.md#1295-the-foreach-statement) of the *type*.
|
||||||
* An *interface type*:
|
* An *interface type*:
|
||||||
* `System.Collections.Generic.IEnumerable<T>`
|
* `System.Collections.Generic.IEnumerable<T>`
|
||||||
* `System.Collections.Generic.IReadOnlyCollection<T>`
|
* `System.Collections.Generic.IReadOnlyCollection<T>`
|
||||||
|
|
|
@ -55,11 +55,13 @@ The *type* of a parameter collection shall be one of the following valid target
|
||||||
- A *type* with an appropriate *[create method](https://github.com/dotnet/csharplang/blob/main/proposals/csharp-12.0/collection-expressions.md#create-methods)*,
|
- A *type* with an appropriate *[create method](https://github.com/dotnet/csharplang/blob/main/proposals/csharp-12.0/collection-expressions.md#create-methods)*,
|
||||||
which is at least as accessible as the declaring member, and with a corresponding *element type* resulting from that determination
|
which is at least as accessible as the declaring member, and with a corresponding *element type* resulting from that determination
|
||||||
- A *struct* or *class type* that implements `System.Collections.IEnumerable` where:
|
- A *struct* or *class type* that implements `System.Collections.IEnumerable` where:
|
||||||
- The *type* has a constructor that can be invoked with no arguments, and the constructor is at least as accessible as the declaring member, and
|
- The *type* has a constructor that can be invoked with no arguments, and the constructor is at least as accessible as the declaring member.
|
||||||
- The *type* has an instance (not an extension) method `Add` that can be invoked with a single argument of
|
- The *type* has an instance (not an extension) method `Add` where:
|
||||||
the [*iteration type*](https://github.com/dotnet/csharpstandard/blob/draft-v9/standard/statements.md#1395-the-foreach-statement),
|
- The method can be invoked with a single value argument.
|
||||||
and the method is at least as accessible as the declaring member,
|
- If the method is generic, the type arguments can be inferred from the argument.
|
||||||
in which case the *element type* is the *iteration type*
|
- The method is at least as accessible as the declaring member.
|
||||||
|
|
||||||
|
In which case the *element type* is the [*iteration type*](https://github.com/dotnet/csharpstandard/blob/draft-v9/standard/statements.md#1395-the-foreach-statement) of the *type*.
|
||||||
- An *interface type*
|
- An *interface type*
|
||||||
- `System.Collections.Generic.IEnumerable<T>`,
|
- `System.Collections.Generic.IEnumerable<T>`,
|
||||||
- `System.Collections.Generic.IReadOnlyCollection<T>`,
|
- `System.Collections.Generic.IReadOnlyCollection<T>`,
|
||||||
|
@ -94,6 +96,7 @@ A parameter collection permits arguments to be specified in one of two ways in a
|
||||||
[Collection expressions](https://github.com/dotnet/csharplang/blob/main/proposals/csharp-12.0/collection-expressions.md)
|
[Collection expressions](https://github.com/dotnet/csharplang/blob/main/proposals/csharp-12.0/collection-expressions.md)
|
||||||
as though the arguments were used as expression elements in a collection expression in the same order,
|
as though the arguments were used as expression elements in a collection expression in the same order,
|
||||||
and uses the newly created collection instance as the actual argument.
|
and uses the newly created collection instance as the actual argument.
|
||||||
|
When constructing the collection instance, the original *unconverted* arguments are used.
|
||||||
|
|
||||||
Except for allowing a variable number of arguments in an invocation, a parameter collection is precisely equivalent to
|
Except for allowing a variable number of arguments in an invocation, a parameter collection is precisely equivalent to
|
||||||
a value parameter of the same type.
|
a value parameter of the same type.
|
||||||
|
|
Загрузка…
Ссылка в новой задаче