22 June 2010

Being dim #2: No generic global procedures

The other day I was writing some unit tests and needed some helper functions to look up some array elements of in arrays of different base types. I had several overloaded functions to do the job, like this:

function IndexOf(const Item: string; const A: array of string): Integer; overload;
function IndexOf(const Item: Integer; const A: array of Integer): Integer; overload;

Oh, I thought, generics are a way round this, so I replaced the overloaded functions with something like

function IndexOf<T>(const Item: T; const A: array of T): Integer;

only to be get compiler error 2530: Type parameters not allowed on global procedure or function. Now, I didn't know that and I'm sharing it in case some of you didn't either.

And the solution? I sorted it by using a static class to hold the code, i.e.

  TSomeClass = class(TObject)
    class function IndexOf<T>(const Item: T; const A: array of T): Integer;

This works fine.

I've not provided implementation details of any of this code since the details are not important in this context.


Max said...

This comment is not specific to this particular blog entry. However, I just want you to know how much I appreciate your blogs and your web site.


DelphiDabbler said...

Thanks Max - much appreciated.


Anonymous said...

still the same in XE5

strange limitation - I wonder if there's a "good reason" for it...

Peter Johnson said...

Dunno why, or even if there's a good reason. Maybe someone is trying to stop us using procedural code!