Охранная проверка лямбда

Я обычно выполняю проверку защиты следующим образом:

public void doStuff(Foo bar, Expression<Func<int, string>> pred) {
  if (bar == null) throw new ArgumentNullException();
  if (pred == null) throw new ArgumentNullException();
  // etc...
}

Я видел эту дополнительную проверку, которая гарантирует, что предикат на самом деле лямбда:

  if (pred.NodeType != ExpressionType.Lambda) throw new ArgumentException();

В перечислении ExpressionType есть много возможностей, но я не понимаю, как кто-либо из них применится, потому что я предположил, что компилятор разрешит только lambda.

Q1: Есть ли преимущества для этого? Мы проводим тщательную проверку всех входов, так что это добавляет ценность?

Q2: Существует ли ограничение производительности - то есть занимает ли он больше времени, чем обычная проверка типа/границ/нулей?

Ответ 1

Func<int, string> является делегатом, который может быть адресом функции или встроенным в виде лямбда-выражения [ () => x].

Expression<TDelegate> наследуется от LambdaExpression, а NodeType для Expression<TDelegate> всегда ExpressionType.Lambda.

Итак, я думаю, что такой защитный код не нужен.