次の方法で共有


ジェネリック メソッドは型パラメータを指定しなければなりません

更新 : 2007 年 11 月

TypeName

GenericMethodsShouldProvideTypeParameter

CheckId

CA1004

カテゴリ

Microsoft.Design

互換性に影響する変更点

あり

原因

外部から参照可能なジェネリック メソッドのパラメータ シグネチャに、そのメソッドのすべての型パラメータに対応する型が含まれていません。

規則の説明

型引数を明示的に指定するのではなく、メソッドに渡す引数の型によってジェネリック メソッドの型引数を決定する方法が推論されます。推論を有効にするには、ジェネリック メソッドのパラメータ シグネチャに、そのメソッドの型パラメータと同じ型のパラメータが含まれている必要があります。この場合、型引数を指定する必要がなくなります。すべての型パラメータについて推論を使用する場合、ジェネリック インスタンス メソッドを呼び出す構文と、非ジェネリック インスタンス メソッドを呼び出す構文は同じになります。これにより、ジェネリック メソッドの使用方法が単純化されます。

違反の修正方法

この規則違反を修正するには、メソッドのすべての型パラメータについて同じ型がパラメータ シグネチャに含まれるようにデザインを変更します。

警告を抑制する状況

この規則による警告は抑制しないでください。理解しやすく使いやすい構文でジェネリック型を指定することで、習得に必要な時間が短縮され、新しいライブラリの採用率が向上します。

使用例

2 つのジェネリック メソッドを呼び出す構文を次の例に示します。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# プログラミング ガイド)