更新:2007 年 11 月
| TypeName | ConsiderPassingBaseTypesAsParameters | 
| CheckId | CA1011 | 
| 类别 | Microsoft.Design | 
| 是否重大更改 | 是 | 
原因
某方法声明包含一个派生类型的形参,且该方法仅调用该参数的基类型的成员。
规则说明
在方法声明中将基类型指定为参数时,可以将派生自基类型的任何类型作为相应的变量传递给方法。在方法体中使用该变量时,所执行的特定方法取决于该变量的类型。如果不需要派生类型提供的其他功能,则使用基类型可允许更广泛地使用方法。
如何修复冲突
要修复与该规则的冲突,请将参数的类型更改为其基类型。
何时禁止显示警告
如果方法需要派生类型提供的特定功能,或者强制仅仅将该派生类型或另一个派生类型传递给方法,则可以安全地禁止显示此规则发出的警告。在这种情况下,代码将更为可靠,因为编译器和运行库会提供强类型检查。
示例
下面的示例演示与该规则冲突的方法 ManipulateFileStream,此方法只能与 FileStream 对象一起使用。第二个方法 ManipulateAnyStream 将 FileStream 参数替换为 Stream,从而满足该规则。
Imports System
Imports System.IO
Namespace DesignLibrary
    Public Class StreamUser
        Sub ManipulateFileStream(ByVal stream As IO.FileStream)
            If stream Is Nothing Then Throw New ArgumentNullException("stream")
            Dim anInteger As Integer = stream.ReadByte()
            While (anInteger <> -1)
                ' Do something.
                anInteger = stream.ReadByte()
            End While
        End Sub
        Sub ManipulateAnyStream(ByVal anyStream As IO.Stream)
            If anyStream Is Nothing Then Throw New ArgumentNullException("anyStream")
            Dim anInteger As Integer = anyStream.ReadByte()
            While (anInteger <> -1)
                ' Do something.
                anInteger = anyStream.ReadByte()
            End While
        End Sub
    End Class
   Public Class TestStreams
      Shared Sub Main()
            Dim someStreamUser As New StreamUser()
            Dim testFileStream As New FileStream( _
               "test.dat", FileMode.OpenOrCreate)
            Dim testMemoryStream As New MemoryStream(New Byte() {})
            ' Cannot be used with testMemoryStream.
            someStreamUser.ManipulateFileStream(testFileStream)
            someStreamUser.ManipulateAnyStream(testFileStream)
            someStreamUser.ManipulateAnyStream(testMemoryStream)
            testFileStream.Close()
        End Sub
   End Class
End Namespace
using System;
using System.IO;
namespace DesignLibrary
{
    public class StreamUser
    {
        int anInteger;
        public void ManipulateFileStream(FileStream stream)
        {
            while ((anInteger = stream.ReadByte()) != -1)
            {
                // Do something.
            }
        }
        public void ManipulateAnyStream(Stream anyStream)
        {
            while ((anInteger = anyStream.ReadByte()) != -1)
            {
                // Do something.
            }
        }
    }
    class TestStreams
    {
        static void Main()
        {
            StreamUser someStreamUser = new StreamUser();
            MemoryStream testMemoryStream = new MemoryStream(new byte[] { });
            using (FileStream testFileStream =
                     new FileStream("test.dat", FileMode.OpenOrCreate))
            {
                // Cannot be used with testMemoryStream.
                someStreamUser.ManipulateFileStream(testFileStream);
                someStreamUser.ManipulateAnyStream(testFileStream);
                someStreamUser.ManipulateAnyStream(testMemoryStream);
            }
        }
    }
}
using namespace System;
using namespace System::IO;
namespace DesignLibrary
{
   public ref class StreamUser
   {
      int anInteger;
   public:
      void ManipulateFileStream(FileStream^ stream)
      {
         while((anInteger = stream->ReadByte()) != -1)
         {
            // Do something.
         }
      }
      void ManipulateAnyStream(Stream^ anyStream)
      {
         while((anInteger = anyStream->ReadByte()) != -1)
         {
            // Do something.
         }
      }
   };
}
using namespace DesignLibrary;
static void main()
{
   StreamUser^ someStreamUser = gcnew StreamUser();
   FileStream^ testFileStream = 
      gcnew FileStream("test.dat", FileMode::OpenOrCreate);
   MemoryStream^ testMemoryStream = 
      gcnew MemoryStream(gcnew array<Byte>{});
   // Cannot be used with testMemoryStream.
   someStreamUser->ManipulateFileStream(testFileStream);
   someStreamUser->ManipulateAnyStream(testFileStream);
   someStreamUser->ManipulateAnyStream(testMemoryStream);
   testFileStream->Close();
}