CA2241:为格式化方法提供正确的参数

类型名

ProvideCorrectArgumentsToFormattingMethods

CheckId

CA2241

类别

Microsoft.Usage

是否重大更改

原因

传递到方法的 format 字符串参数,例如 WriteLineWriteString.Format,不包含对应于每个对象参数的格式项,反之亦然。

规则说明

方法的参数,例如 WriteLineWriteFormat 由一个格式字符串后接几个 Object 实例组成。格式字符串由文本和 {index[,alignment][:formatString]} 形式的嵌入格式项组成。'index'是一个从零开始的整数,它指示要格式化的对象。如果某对象在格式字符串中没有相应索引,该对象将被忽略。如果“index”指定的对象不存在,将在运行时引发 FormatException

如何解决冲突

要修复与该规则的冲突,请为每个对象参数提供一个格式项,同时为每个格式项提供一个对象参数。

何时禁止显示警告

不要禁止显示此规则发出的警告。

示例

下面的示例演示与该规则冲突的两种情况。

Imports System

Namespace UsageLibrary

   Class CallsStringFormat

      Sub CallFormat()

         Dim file As String = "file name" 
         Dim errors As Integer = 13

         ' Violates the rule.
         Console.WriteLine(String.Format("{0}", file, errors))

         Console.WriteLine(String.Format("{0}: {1}", file, errors))

         ' Violates the rule and generates a FormatException at runtime.
         Console.WriteLine(String.Format("{0}: {1}, {2}", file, errors))

      End Sub 

   End Class 

End Namespace
using System;

namespace UsageLibrary
{
   class CallsStringFormat
   {
      void CallFormat()
      {
         string file = "file name";
         int errors = 13;

         // Violates the rule.
         Console.WriteLine(string.Format("{0}", file, errors));

         Console.WriteLine(string.Format("{0}: {1}", file, errors));

         // Violates the rule and generates a FormatException at runtime.
         Console.WriteLine(string.Format("{0}: {1}, {2}", file, errors));
      }
   }
}