delphi – 我对匿名方法类型使用什么通用约束?
发布时间:2020-12-15 09:38:56 所属栏目:大数据 来源:网络整理
导读:我想声明一个通用记录,如下所示: type TMyDelegateT: constraint = record private fDelegate: T; public class operator Implicit(a: T): TMyDelegate; class operator Implicit(A: TMyDelegate: T); end; 我想限制T引用过程/函数. (越多越好). 我试过这个
我想声明一个通用记录,如下所示:
type TMyDelegate<T: constraint> = record private fDelegate: T; public class operator Implicit(a: T): TMyDelegate; class operator Implicit(A: TMyDelegate: T); end; 我想限制T引用过程/函数. (越多越好). 我试过这个,但它没有编译: program Project3; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; type TProc1 = reference to procedure(a: Integer); TProc2 = reference to procedure(b: TObject); TTest<T: TProc1,TProc2> = record private fData: T; public class operator Implicit(a: T): TTest<T>; class operator Implicit(a: TTest<T>): T; end; { TTest<T> } class operator TTest<T>.Implicit(a: T): TTest<T>; begin Result.fData:= a; end; class operator TTest<T>.Implicit(a: TTest<T>): T; begin Result:= a.fData; end; var Delegate1: TProc1; Delegate2: TProc2; var MyTest1: TTest<TProc1>; <<-- error MyTest2: TTest<TProc2>; begin MyTest1:= procedure(a: Integer) begin WriteLn(IntToStr(a)); end; end. 这给出了编译错误:
有没有办法将泛型类型约束为(列表)匿名类型? 解决方法
没有办法指定这样的约束.可能的限制是:
>价值类型. 这在文档中有所介绍:http://docwiki.embarcadero.com/RADStudio/en/Constraints_in_Generics 文档没有说明的是引用过程类型计为接口.这就是你的泛型类型使用该约束进行编译的原因.但这对你没有任何用处.因为引用过程类型没有继承.因此,唯一可以满足特定参考过程类型约束的是特定类型的东西. 实际上您的类型无法实例化.那是因为约束 T: TProc1,TProc2 指定T支持这两个引用过程接口.没有什么能做到的.没有什么能同时支持TProc1和TProc2. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |