Abbiamo visto nel post precedente come il compilatore Delphi crea una classe finta per ogni unit così che anche il codice procedurale soddisfi la regola CLS 36. Cosa succede invece quando non gli lasciamo più spazio agli trucchi e trasgrediamo in modo esplicito una regola CLS, per esempio la CLS Rule 11 (quella sulla signature)? Potremmo da C# "consumare" un codice come quello di seguito? (al tipo Word di Delphi corrisponde in C# il tipo ushort, non CLS)
// DelphiCls.pas
library DelphiCls;
uses
Foo in 'Foo.pas';
// inutile: Delphi non è CLS-compliant
[assembly: CLSCompliant(True)]
begin
end.
// Foo.pas
unit Foo;
interface
// non ha una signature conforme al CLS
function BadArgType(i: Word): Word;
implementation
function BadArgType(i: Word): Word;
begin
Result := i + 1;
end;
end.
La risposta è sì:
// C#
using System;
class Test
{
static void Main()
{
ushort i = 2;
Console.WriteLine(Foo.Units.Foo.BadArgType(i)); // scrive 3
Console.Read();
}
}
Qualcuno sa perché, prima che arrivi il giovedì?