且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

为什么类在泛型中使用时实现的接口与接口类型不兼容?

更新时间:2022-12-04 20:43:45

这里没有编译器错误。编译器的行为如同设计。由于类型确实不兼容,分配失败。 Delphi通用类型是不变式

文档说:


如果基本类型相同(或者是通用类型的别名)并且类型参数相同,那么两个实例化的泛型被认为是可分配兼容的。


现在,让我们看看第一个失败的任务:

  var 
ACollection1:TDictionary< string,TStringWildcard2&gt ;;
ACollection2:TDictionary< string,Wildcard>;
....
ACollection2:= ACollection1;

这个失败是因为类型参数不相同。



而对于 ACollection4 我们有

  var 
ACollection4:TDictionary< string,IUnknown>;
....
ACollection4:= TDictionary< string,OleVariant> .Create;

同样,类型参数也不相同。



语言设计者选择使通用类型不变是非常好的理由。考虑下面的例子。
  type 
TClass1 = class(TObject)
end;
TClass2 = class(TClass1)
end;

var
List1:TList< TClass1>;
List2:TList< TClass2>;
....
List2:= TList< TClass2> .Create;
List1:= List2; //不编译,但让我们想象它
List1.Add(TClass1.Create);