更新 : 2007 年 11 月
TypeName |
DoNotDeclareStaticMembersOnGenericTypes |
CheckId |
CA1000 |
カテゴリ |
Microsoft.Design |
互換性に影響する変更点 |
あり |
原因
外部から参照可能なジェネリック型に、static (Visual Basic では Shared) メンバが含まれています。
規則の説明
ジェネリック型の static メンバを呼び出すときには、その型の型引数も指定する必要があります。推論をサポートしないジェネリック インスタンス メンバを呼び出すときには、そのメンバに型引数を指定する必要があります。この 2 つの場合で、型引数を指定するときに使用される構文は異なりますが、混同される可能性があります。次に呼び出しの例を示します。
' Shared method in a generic type.
GenericType(Of Integer).SharedMethod()
' Generic instance method that does not support inference.
someObject.GenericMethod(Of Integer)()
// Static method in a generic type.
GenericType<int>.StaticMethod();
// Generic instance method that does not support inference.
someObject.GenericMethod<int>();
一般的に、メンバが呼び出されたときに型引数を指定する必要がないように、前者の宣言はどちらも避ける必要があります。その結果、ジェネリック型のメンバを呼び出す構文がジェネリック型以外の構文と同じになります。詳細については、「ジェネリック メソッドは型パラメータを指定しなければなりません」を参照してください。
違反の修正方法
このルールの違反を修正するには、静的メンバを削除するか、インスタンス メンバに変更します。
警告を抑制する状況
この規則による警告は抑制しないでください。理解しやすく使いやすい構文でジェネリック型を指定することで、習得に必要な時間が短縮され、新しいライブラリの採用率が向上します。
使用例
この違反を生じさせるメソッドの例を次に示します。
Imports System
Imports System.Runtime.InteropServices
Namespace Samples
Public NotInheritable Class EnumParser(Of T)
Private Sub New()
End Sub
' Fires this violation
Public Shared Function TryParse(ByVal value As String, <Out()> ByRef result As T) As Boolean
Try
result = DirectCast([Enum].Parse(GetType(T), value), T)
Return True
Catch ex As ArgumentException
End Try
result = Nothing
Return False
End Function
End Class
Module Program
Public Sub Main()
Dim result As DayOfWeek
' Must specify type argument
If EnumParser(Of DayOfWeek).TryParse("Monday", result) Then
Console.WriteLine("Conversion Succeeded!")
End If
End Sub
End Module
End Namespace
using System;
namespace Samples
{
public static class EnumParser<T>
{ // Fires this violation
public static bool TryParse(string value, out T result)
{
try
{
result = (T)Enum.Parse(typeof(T), value);
return true;
}
catch (ArgumentException)
{
}
result = default(T);
return false;
}
}
static class Program
{
public static void Main()
{
DayOfWeek dayOfWeek;
// Must specify type argument
if (EnumParser<DayOfWeek>.TryParse("Monday", out dayOfWeek))
{
Console.WriteLine("Conversion Succeeded!");
}
}
}
}
上記の例では、ジェネリック型の static メンバを宣言し、このメンバを呼び出すときにユーザーに型引数を指定させています。
型パラメータの T をクラスからメソッドに移動し、呼び出し時にコンパイラで推論できるようにして、上記の違反を修正する例を次に示します。
関連規則
コレクションは、ジェネリック インターフェイスを実装しなければなりません
ジェネリック メソッドは型パラメータを指定しなければなりません