Необязательные параметры делегатов не работают должным образом

Почему этот кусок кода не компилируется?

delegate int xxx(bool x = true);

xxx test = f;

int f()
{
   return 4;
}

person Stepan Benes    schedule 12.04.2011    source источник


Ответы (4)


Необязательные параметры предназначены для использования на вызывающей стороне, а не на том, что эффективно похоже на реализацию интерфейса с одним методом. Так, например, это должно скомпилироваться:

delegate void SimpleDelegate(bool x = true);

static void Main()
{
    SimpleDelegate x = Foo;
    x(); // Will print "True"
}

static void Foo(bool y)
{
    Console.WriteLine(y);
}
person Jon Skeet    schedule 12.04.2011

Что произойдет test(false)? Это повредит стек, потому что подписи должны совпадать.

person Andrey    schedule 12.04.2011

Попробуйте так:

static int f(bool a)
{
  return 4;
}
person Marco    schedule 12.04.2011

Поскольку необязательные параметры не изменяют базовую сигнатуру метода, что важно для делегатов.

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

person Adam Houldsworth    schedule 12.04.2011