c# generic syntax don't understand

Can anyone explain this to me...I'm too dumb! This is from the telerik mvc grid extensions, you make columns with
I put a break in the Columns func, and its sig is:
Columns(Action<GridColumnFactory> configurator)
Now, I understand, Action<T> is a delegate void method, but what I don't understand is how columns=>{
columns.Bound("xx"); }is implicitly cast to GridColumnFactory?
(GridColumnFactory- a class which has params in its constructor )
Who is Participating?
Carl TawnConnect With a Mentor Systems and Integration DeveloperCommented:
>> so the configurator is an Action<GridColumnFactory<T>>, does that mean the default call is to make a new one?

Yes, that's the jist of it.  Because it is a Lambda expression, the underlying mechanics will instantiate a new object of type Action<GridColumnFactory<T>>, and that becomes the context for the expression.  So, anything to the right of => is using an instance of the GridColumnFactory<T> object to make calls on.
Carl TawnSystems and Integration DeveloperCommented:
It isn't being implicitly cast - it is explicitly declared by the Columns() method.

If you look at the documentation for the Columns() method, you'll see that it takes a parameter of type Action<GridColumnFactory<T>> (reference: http://www.telerik.com/help/aspnet-mvc/m_telerik_web_mvc_ui_fluent_gridbuilder_1_columns.html) where T is the model that the grid is being bound to.
Silas2Author Commented:
Ok, its in the function sig in the docs, but how does columns=>{ columns.bound("xx"; columns.bound("yy");} become acceptable as GridColumnFactory? it doesn't look anything like the factory.
Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Carl TawnSystems and Integration DeveloperCommented:
columns (the left-hand operator version) is created at runtime implicitly based on the context.  The runtime can figure out the type from the context.

So, in you case, columns will actually be an object of type GridColumnFactory<TModel>. Bound() is a method on the factory class.

Hope that makes some sense.
Silas2Author Commented:
Most kind, yes Its certainly helping.

So when the param comes into the call it (the runtime) hasn't instanced the factory even though it's (or something is) in the call.

In the call , (which is on the GridBuilder obj), this is the first line:
configurator(new GridColumnFactory(Component, Context));

(configurator is the method param)

Aah, the penny (half) dropped as I was typing, so the configurator is an Action<GridColumnFactory<T>>, does that mean the default call is to make a new one? Factory I mean, so does that mean if x = Action<Type>, then x(new Type())?
Silas2Author Commented:
So, from the docs:
Action<string> messageTarget;
messageTarget = s => Console.WriteLine(s);

So with the grid:
Action<GridColumnFactory<T>> x;
x=>{ x.Bound(1); x.Bound(2); }

Ah, I think I get it, for each x.Bound call, its using the factory's bound call. So the call into 'Columns', is receiving the right param, not because its been explicitly sent, but because the receiving procedure but because of its signature.
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.