Issue
I hope I worded the title of my question appropriately.
In c# I can use lambdas (as delegates), or the older delegate syntax to do this:
Func<string> fnHello = () => "hello";
Console.WriteLine(fnHello());
Func<string> fnHello2 = delegate()
{
return "hello 2";
};
Console.WriteLine(fnHello2());
So why can't I "inline" the lambda or the delegate body, and avoid capturing it in a named variable (making it anonymous)?
// Inline anonymous lambda not allowed
Console.WriteLine(
(() => "hello inline lambda")()
);
// Inline anonymous delegate not allowed
Console.WriteLine(
(delegate() { return "hello inline delegate"; })()
);
An example that works in javascript (just for comparison) is:
alert(
(function(){ return "hello inline anonymous function from javascript"; })()
);
Which produces the expected alert box.
UPDATE: It seems you can have an inline anonymous lambda in C#, if you cast appropriately, but the amount of ()'s starts to make it unruly.
// Inline anonymous lambda with appropriate cast IS allowed
Console.WriteLine(
((Func<string>)(() => "hello inline anonymous lambda"))()
);
Perhaps the compiler can't infer the sig of the anonymous delegate to know which Console.WriteLine() you're trying to call? Does anyone know why this specific cast is required?
Solution
Lambdas in C# do not have types, until they are used in a context that casts them to a delegate or Expression type.
That's why you cannot do the following:
var x = () => "some lambda";
You might enjoy Eric Lippert's Series on Lambda Expressions vs Anonymous Methods
- Lambda vs Anon - Part One
- Lambda vs Anon - Part Two
- Lambda vs Anon - Part Three
- Lambda vs Anon - Part Four
- Lambda vs Anon - Part Five
Answered By - Brian Answer Checked By - Cary Denson (PHPFixing Admin)
0 Comments:
Post a Comment
Note: Only a member of this blog may post a comment.