例:
interface ISalary<T>
{
void Pay();
}
class BaseSalaryCounter<T> : ISalary<T>
{
public void Pay()
{
Console.WriteLine("Pay base salary");
}
}
class Emplyee
{
public string Name { get; set; }
}
class Programmer : Emplyee
{ }
class Manager : Emplyee
{ }
class Program
{
static void Main(string[] args)
{
ISalary<Programmer> s = new BaseSalaryCounter<Programmer>();
PrintSalary(s);
}
static void PrintSalary(ISalary<Emplyee> s)
{ s.Pay(); }
}
在PrintSalary这个方法中,方法接受的参数类型是ISalary<Employee>。于是,我们想当然地认为ISalary<Programmer>必然可是可以被PrintSalary方法接收的。实现这段代码变异会发生类似如下的错误:
错误 CS1503 参数 1: 无法从“ConsoleApp1.ISalary<ConsoleApp1.Programmer>”转换为“ConsoleApp1.ISalary<ConsoleApp1.Emplyee>” ConsoleApp1 C:\Users\WH\Desktop\ConsoleApp1\ConsoleApp1\Program.cs 33 活动的
编译器对于接口和委托类型参数的检查是非常严格的,除非用关键字out特别声明,不然这段代码只会编译失败。要让PrintSalary完成需求,我们可以使用泛型类型参数:
static void PrintSalary<T>(ISalary<T> s)
{ s.Pay(); }