Covariant in C#
covariant可以理解为变异.也就是一种类型转换成另一种类型.
Anders在<<The C# Promgramiming Language>>的数组一章中提到了数组的变异.
如果一个引用类型A可以隐式或者显式地转化为B,则A[R]也可以转化成B[R],R可以任意指定,但A,B必须相同,这种关系称为数组变异.数组变异不能推广到值类型,比如不能从int[]转化成object[],也不能从byte[]转化成int[].
今天在Bill Wanger的blog上发现了一篇帖子,说的是函数返回类型的变异,C#不支持函数返回类型的变异,比如下面的代码是不能通过变异的
编译时会报错,当方法重载是不能改变返回类型,这在C++中是支持的.
Bill Wanger说可以用一个范型接口来实现, 俺的C#是1.1的不支持范型,不过也把代码粘在下面
这样如果适当限制T的取值,可以利用范型实现C++的函数返回类型的变异.
Anders在<<The C# Promgramiming Language>>的数组一章中提到了数组的变异.
如果一个引用类型A可以隐式或者显式地转化为B,则A[R]也可以转化成B[R],R可以任意指定,但A,B必须相同,这种关系称为数组变异.数组变异不能推广到值类型,比如不能从int[]转化成object[],也不能从byte[]转化成int[].
今天在Bill Wanger的blog上发现了一篇帖子,说的是函数返回类型的变异,C#不支持函数返回类型的变异,比如下面的代码是不能通过变异的
class ClassParent
{
static void Main()
{
}
protected virtual ClassParent GetThing()
{
return null;
}
}
class ClassSon:ClassParent
{
protected override ClassSon GetThing()
{
return null;
}
}
{
static void Main()
{
}
protected virtual ClassParent GetThing()
{
return null;
}
}
class ClassSon:ClassParent
{
protected override ClassSon GetThing()
{
return null;
}
}
编译时会报错,当方法重载是不能改变返回类型,这在C++中是支持的.
Bill Wanger说可以用一个范型接口来实现, 俺的C#是1.1的不支持范型,不过也把代码粘在下面
public interface Producer<T>
{
T getThing();
}
public class D : Producer <D>
{
public D getThing()
{
return null;
}
}
{
T getThing();
}
public class D : Producer <D>
{
public D getThing()
{
return null;
}
}
这样如果适当限制T的取值,可以利用范型实现C++的函数返回类型的变异.