更新时间:2022-12-04 20:43:45
这里没有编译器错误。编译器的行为如同设计。由于类型确实不兼容,分配失败。 Delphi通用类型是不变式。
文档说:
如果基本类型相同(或者是通用类型的别名)并且类型参数相同,那么两个实例化的泛型被认为是可分配兼容的。
现在,让我们看看第一个失败的任务:
var
ACollection1:TDictionary< string,TStringWildcard2> ;;
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);