CA1004:泛型方法應該提供型別參數
型別名稱 |
GenericMethodsShouldProvideTypeParameter |
CheckId |
CA1004 |
分類 |
Microsoft.Design |
中斷變更 |
中斷 |
原因
外部可見之泛型方法的參數簽章不包含對應到此方法之所有型別參數的型別。
規則描述
推斷是指如何利用傳遞到泛型方法的引數型別,而不是利用型別引數的明確規格,來決定泛型方法的型別引數。 若要啟用推斷,泛型方法的參數簽章必須包含與方法之型別參數具有相同型別的參數。 在上述情形中,不必指定型別引數。 使用所有型別參數的推斷時,呼叫泛型和非泛型執行個體方法 (Instance Method) 之語法是相同的。 這會簡化泛型方法的可用性。
如何修正違規
若要修正此規則的違規情形,請變更設計,讓參數簽章包含與方法之每個型別參數相同的型別參數。
隱藏警告的時機
請勿隱藏此規則的警告。 使用易於了解和使用的語法提供泛型,以便減少學習所需的時間,並增加新程式庫的採用率。
範例
下列範例會顯示呼叫兩個泛型方法的語法。 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);
}
}
}