Why Transform and not Prefab?

When scripting you need to create a variable of the type Transform but I can attach a prefab? What's the reason?

sorry about my poor english...

Instantiate actually takes something of type Object, not of type Transform. See: http://unity3d.com/support/documentation/ScriptReference/Object.Instantiate.html

The examples are quite unclear because they pass Transform instances into Instantiate, without mentioning why they're doing this. The vague documentation/examples leads to this sort of confusion.

Reading the documentation we do have for Object.Instantiate we see:

Clones the object original, places it at position and sets the rotation to rotation, then returns the cloned object.

So Object.Instantiate isn't really limited to working with prefabs; you can instantiate any object that you can get a reference to.

Prefabs are objects that aren't in the scene - you either get a reference to them by assigning them to your script in the inspector or via Resources.Load(). But when you clone them with Instantiate() they appear in the scene.

Thinking of it this way, it isn't obvious what a "Prefab" type would actually be in addition to being an Object or GameObject.

I Don't see any problem with this, yes, a Prefab is a Transform that you can instantiate (create a copy of this transform in the scene). The only diference is that the prefab is not in the scene.