Универсальные методы должны предоставлять параметр типа
Обновлен: Ноябрь 2007
TypeName |
GenericMethodsShouldProvideTypeParameter |
CheckId |
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);
}
}
}
Связанные правила
Не используйте слишком много параметров в универсальных типах
Коллекции должны реализовать универсальный интерфейс
Не объявляйте статические элементы в универсальных типах
Не следует раскрывать универсальные списки
Не вкладывайте универсальные типы в подписи членов
Используйте экземпляры обработчика универсальных событий
Используйте универсальные методы, если это уместно
См. также
Ссылки
Универсальные шаблоны (Руководство по программированию на C#)