CA1004: универсальные методы должны предоставлять параметр типа
Товар | Значение |
---|---|
Идентификатор правила | CA1004 |
Категория | Microsoft.Design |
Критическое изменение | Критическое |
Причина
Сигнатура параметра внешнего видимого универсального метода не содержит типов, соответствующих всем параметрам типа метода.
Описание правила
Вывод – это то, как аргумент типа универсального метода определяется по типу аргумента, переданного методу, а не по явному указанию аргумента типа. Чтобы задействовать вывод, сигнатура параметра универсального метода должна включать параметр, тип которого совпадает с параметром типа для метода. В этом случае аргумент типа указывать не обязательно. При использовании вывода для всех параметров типа синтаксис для вызова универсальных и негенерических методов экземпляра идентичен. Это упрощает удобство использования универсальных методов.
Устранение нарушений
Чтобы устранить нарушение этого правила, измените структуру таким образом, чтобы подпись параметра содержала один и тот же тип для каждого параметра типа метода.
Когда лучше отключить предупреждения
Для этого правила отключать вывод предупреждений не следует. Предоставление универсальных шаблонов в синтаксисе, который легко понять и использовать, сокращает время, необходимое для изучения, и увеличивает скорость внедрения новых библиотек.
Пример
В следующем примере показан синтаксис для вызова двух универсальных методов. Аргумент типа для InferredTypeArgument
вывода, и аргумент типа для NotInferredTypeArgument
него должен быть явно указан.
Imports System
Namespace DesignLibrary
Public Class Inference
' This method violates the rule.
Sub NotInferredTypeArgument(Of T)()
Console.WriteLine(GetType(T))
End Sub
' This method satisfies the rule.
Sub InferredTypeArgument(Of T)(sameAsTypeParameter As T)
Console.WriteLine(sameAsTypeParameter)
End Sub
End Class
Class Test
Shared Sub Main()
Dim infer As New Inference()
infer.NotInferredTypeArgument(Of Integer)()
infer.InferredTypeArgument(3)
End Sub
End Class
End Namespace
using System;
namespace DesignLibrary
{
public class Inference
{
// This method violates the rule.
public void NotInferredTypeArgument<T>()
{
Console.WriteLine(typeof(T));
}
// This method satisfies the rule.
public void InferredTypeArgument<T>(T sameAsTypeParameter)
{
Console.WriteLine(sameAsTypeParameter);
}
}
class Test
{
static void Main()
{
Inference infer = new Inference();
infer.NotInferredTypeArgument<int>();
infer.InferredTypeArgument(3);
}
}
}
Связанные правила
CA1005: не используйте слишком много параметров в универсальных типах
CA1010: коллекции должны реализовывать универсальный интерфейс
CA1000: не объявляйте статические элементы в универсальных типах
CA1002: не следует раскрывать универсальные списки
CA1006: не вкладывайте универсальные типы в сигнатуры членов
CA1003: используйте экземпляры обработчика универсальных событий
CA1007: используйте универсальные объекты, если это уместно
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по