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.

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

This works fine.

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

4 comments:

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.

Max

DelphiDabbler said...

Thanks Max - much appreciated.

Peter

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!