Рассмотрим следующий код (C # 4.0):
public class Foo : LambdaExpression { }
Это приводит к следующей ошибке времени разработки:
Foo does not implement inherited abstract member
System.Linq.Expressions.LambdaExpression.Accept(System.Linq.Expressions.Compiler.StackSpiller)
Нет абсолютно никаких проблем с public class Foo : Expression { }
, но из любопытства и ради обучения я искал в Google System.Linq.Expressions.LambdaExpression.Accept(System.Linq.Expressions.Compiler.StackSpiller)
и угадаю, что: ноль результатов вернулось (когда вы в последний раз видели это?) , Само собой разумеется, я нигде не нашел никакой документации по этому методу.
Как я уже сказал, можно легко унаследовать от Expression
; с другой стороны, LambdaExpression
, хотя и не помечен как sealed
(Expression<TDelegate>
наследуется от него), похоже, предназначен для предотвращения наследования от него. Это действительно так? Кто-нибудь знает, о чем этот метод?
РЕДАКТИРОВАТЬ (1): дополнительная информация, основанная на первых ответах. Если вы попытаетесь реализовать Accept, редактор (C # 2010 Express) автоматически выдаст следующую заглушку:
protected override Expression Accept(System.Linq.Expressions.ExpressionVisitor visitor)
{
return base.Accept(visitor);
}
Но вы все равно получаете ту же ошибку. Если вы попытаетесь использовать параметр типа StackSpiller
напрямую, компилятор выдаст другую ошибку: System.Linq.Expressions.Compiler.StackSpiller is inaccessible due to its protection level
.
EDIT (2): Исходя из других ответов, наследование от LambdaExpression невозможно, поэтому вопрос о том, рекомендуется он или нет, становится неактуальным. Интересно, в таких случаях сообщение об ошибке должно быть Foo cannot implement inherited abstract member System.Linq.Expressions.LambdaExpression.Accept(System.Linq.Expressions.Compiler.StackSpiller) because [reasons go here]
; текущее сообщение об ошибке (как доказывают некоторые ответы), кажется, говорит мне, что все, что мне нужно сделать, это реализовать Accept
(что я не могу сделать).