[bitc-dev] Syntax of type variables

Sandro Magi naasking at higherlogics.com
Sun Mar 21 22:13:36 PDT 2010

On 21/03/2010 9:02 PM, Jonathan S. Shapiro wrote:
> One question about C# type variables arises. Is it legal for inner
> declarations to "shadow" the type parameter name, as in:
>   static void f<A>(A x) {
>     ....
>     int A; // note this shadows the type parameter!
>     ...
>   }

No, it's compiler error CS0412:

> Another: are the variable names in a CLI generic declaration
> considered part of the type, or only their positions? That is: if we
> rename the type parameter variables, are we making a new type?

At the CIL level, only the type variable positions are used. They are
also in a separate namespace using a !! prefix, similar to how you
referred to ML type variables being in a separate namespace with a ' prefix.

My vote goes for the ' or something equally distinct. C# has
demonstrated that the angle bracket notation combined with simple
letters and/or words, ie. <T>, makes nested generics a bit of a mess.
The use of appropriate whitespace and syntactically distinct type
variables is much easier to read.

F# supports both notations, 'a and T [2], specified as ML-style "int
list" or C#-style "list<int>" [1], although they suggest the ML notation
only for built-in F# types [3].


[1] http://msdn.microsoft.com/en-us/library/dd233215%28VS.100%29.aspx
[2] From [1], "You can also make a function generic by using the single
quotation mark syntax in a type annotation to indicate that a parameter
type is a generic type parameter"
[3] See "Note" section in [1]

More information about the bitc-dev mailing list