Поделиться через


Использование выражения коллекции для Create() (IDE0303)

Свойство Значение
Идентификатор правила IDE0303
Заголовок Использование выражения коллекции для создания
Категория Стиль
Подкатегории Правила языка (настройки уровня выражения)
Применимые языки C# 12+
Параметры dotnet_style_prefer_collection_expression

Обзор

Это правило помечает, где Create() метод или аналогичный метод, назначенный в качестве метода сборки коллекции (с помощью CollectionBuilderAttribute атрибута), используется для инициализации коллекции и предлагает заменить его выражением коллекции ([...]).

Create() Методы являются общими для неизменяемых коллекций, например ImmutableArray.Create(1, 2, 3).

Примечание.

Для этого правила требуются более последние версии неизменяемых API (например, System.Collections.Immutableкоторые выбирают шаблон коллекции выражений).

Параметры

Параметры указывают поведение, которое требуется применить правило. Сведения о настройке параметров см . в разделе "Формат параметров".

dotnet_style_prefer_collection_expression

Свойство Значение Описание
Имя параметра dotnet_style_prefer_collection_expression
Значения параметра true | when_types_exactly_match Предпочитать использовать выражения коллекции только в том случае, если типы соответствуют точно, например ImmutableArray<int> i = ImmutableArray.Create(1, 2, 3);.
when_types_loosely_match
(.NET 9 и более поздние версии)*
Предпочитать использовать выражения коллекции, даже если типы соответствуют свободно, например IEnumerable<int> i = ImmutableArray.Create(1, 2, 3);. Целевой тип должен соответствовать типу справа или быть одним из следующих типов: IEnumerable<T>, , ICollection<T>IList<T>, . IReadOnlyList<T>IReadOnlyCollection<T>
false | never Отключает проблемное правило.
Значение параметра по умолчанию true в .NET 8
when_types_loosely_match в .NET 9 и более поздних версиях

*Исправление кода при использовании этого параметра может изменить семантику кода.

Пример

// Code with violations.
ImmutableArray<int> i = ImmutableArray.Create(1, 2, 3);
IEnumerable<int> j = ImmutableArray.Create(1, 2, 3);

// Fixed code.
ImmutableArray<int> i = [1, 2, 3];
IEnumerable<int> j = [1, 2, 3];

В следующем фрагменте кода показан пример с пользовательским типом, с аннотированный с CollectionBuilderAttributeпомощью .

public class Program
{
    public static void Main()
    {
        // IDE0303 violation.
        MyCollection<int> c = MyCollection.Create(1, 2, 3);

        // IDE0303 fixed code.
        MyCollection<int> c = [1, 2, 3];
    }
}

static partial class MyCollection
{
    public static MyCollection<T> Create<T>(System.ReadOnlySpan<T> values) => default;
    public static MyCollection<T> Create<T>(T t1, T t2, T t3) => default;
}

[CollectionBuilder(typeof(MyCollection), "Create")]
class MyCollection<T> : IEnumerable<T>
{
    public IEnumerator<T> GetEnumerator() => default;
    IEnumerator IEnumerable.GetEnumerator() => default;
}

Отключение предупреждений

Если вы хотите отключить только одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.

#pragma warning disable IDE0303
// The code that's violating the rule is on this line.
#pragma warning restore IDE0303

Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.

[*.{cs,vb}]
dotnet_diagnostic.IDE0303.severity = none

Чтобы отключить все правила стиля кода, задайте уровень серьезности для категории Style none в файле конфигурации.

[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Style.severity = none

Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.

См. также