Consider the following code (C# 4.0):
public class Foo : LambdaExpression { }
This throws the following design-time error:
Foo does not implement inherited abstract member
System.Linq.Expressions.LambdaExpression.Accept(System.Linq.Expressions.Compiler.StackSpiller)
There’s absolutely no problem with public class Foo : Expression { } but, out of curiosity and for the sake of learning, I’ve searched in Google System.Linq.Expressions.LambdaExpression.Accept(System.Linq.Expressions.Compiler.StackSpiller) and guess what: zero results returned (when was the last time you saw that?). Needless to say, I haven’t found any documentation on this method anywhere else.
As I said, one can easily inherit from Expression; on the other hand LambdaExpression, while not marked as sealed (Expression<TDelegate> inherits from it), seems to be designed to prevent inheriting from it. Is this actually the case? Does anyone out there know what this method is about?
EDIT (1): More info based on the first answers – If you try to implement Accept, the editor (C# 2010 Express) automatically gives you the following stub:
protected override Expression Accept(System.Linq.Expressions.ExpressionVisitor visitor)
{
return base.Accept(visitor);
}
But you still get the same error. If you try to use a parameter of type StackSpiller directly, the compiler throws a different error: System.Linq.Expressions.Compiler.StackSpiller is inaccessible due to its protection level.
EDIT (2): Based on other answers, inheriting from LambdaExpression is not possible so the question as to whether or not it is recommended becomes irrelevant. I wonder if, in cases like this, the error message should be Foo cannot implement inherited abstract member System.Linq.Expressions.LambdaExpression.Accept(System.Linq.Expressions.Compiler.StackSpiller) because [reasons go here]; the current error message (as some answers prove) seems to tell me that all I need to do is implement Accept (which I can’t do).
I just looked at the
LambdaExpressionclass in .NET 3.5 using Reflector and the class has only aninternalconstructor. When I try your code, I’m getting an error “The type ‘System.Linq.Expressions. LambdaExpression’ has no constructors defined”, so on .NET 3.5 this cannot be done (leaving aside the question whether it would be useful to do it).In .NET 4.0 it behaves as you described. However, the
Acceptmethod isinternaland so is theStackSpillertype. This again means that you simply can’t do this (although it isn’t clear from the compiler error message). It is worth noting that the class still has onlyinternalconstructor on .NET 4.0. The compiler only finds another reason why you can’t override it (and doesn’t worry about that any more).EDIT: Regarding the
StackSpillertype – it is internal, so you don’t really need to worry about it. However, it looks that the type comes from DLR, which is a .NET 4.0 component that now handles compilation of lambda expressions (and also C# 4dynamic). Anyway, DLR is open-source, so here is what a summary comment says about this type:This means that it is used to do some pre-processing of lambda expressions when they are compiled using the
Compilemethod. You can get the source code from CodePlex.