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


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

Свойство Значение
Идентификатор правила IDE0303
Титул Используйте выражение коллекции для создания
Категория Стиль
Подкатегории Правила языка (настройки уровня выражения)
Применимые языки С# 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 Предпочитать использовать выражения коллекции только в том случае, если типы соответствуют точно, например List<int> list = new List<int>() { 1, 2 };.
when_types_loosely_match* Предпочтительно использовать выражения коллекции, даже при несовершенном соответствии типов, например, IEnumerable<int> list = new List<int>() { 1, 2 };. Целевой тип должен соответствовать типу справа или быть одним из следующих типов: IEnumerable<T>, , ICollection<T>IList<T>, . IReadOnlyCollection<T>IReadOnlyList<T>
false | never Отключает проблемное правило.
Значение параметра по умолчанию when_types_loosely_match*

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

Пример

// 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

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

См. также