Что действительно странно в том, что значение, которое вы ставите для необязательного параметра в интерфейсе, на самом деле имеет значение. Я полагаю, вы должны задать вопрос, является ли значение деталью интерфейса или деталями реализации. Я бы сказал последнее, но все ведет себя как первое. Например, следующие выходы кода 1 0 2 5 3 7.
// Output:
// 1 0
// 2 5
// 3 7
namespace ScrapCSConsole
{
using System;
interface IMyTest
{
void MyTestMethod(int notOptional, int optional = 5);
}
interface IMyOtherTest
{
void MyTestMethod(int notOptional, int optional = 7);
}
class MyTest : IMyTest, IMyOtherTest
{
public void MyTestMethod(int notOptional, int optional = 0)
{
Console.WriteLine(string.Format("{0} {1}", notOptional, optional));
}
}
class Program
{
static void Main(string[] args)
{
MyTest myTest1 = new MyTest();
myTest1.MyTestMethod(1);
IMyTest myTest2 = myTest1;
myTest2.MyTestMethod(2);
IMyOtherTest myTest3 = myTest1;
myTest3.MyTestMethod(3);
}
}
}
Что-то интересное, что если ваш интерфейс делает параметр необязательный класс, реализующий он не должен делать то же самое:
// Optput:
// 2 5
namespace ScrapCSConsole
{
using System;
interface IMyTest
{
void MyTestMethod(int notOptional, int optional = 5);
}
class MyTest : IMyTest
{
public void MyTestMethod(int notOptional, int optional)
{
Console.WriteLine(string.Format("{0} {1}", notOptional, optional));
}
}
class Program
{
static void Main(string[] args)
{
MyTest myTest1 = new MyTest();
// The following line won't compile as it does not pass a required
// parameter.
//myTest1.MyTestMethod(1);
IMyTest myTest2 = myTest1;
myTest2.MyTestMethod(2);
}
}
}
То, что кажется ошибкой, однако, что если вы явно реализуете интерфейс, значение, которое вы даете в классе для необязательного значения, бессмысленно. Как в следующем примере вы могли бы использовать значение 9? Это даже не дает предупреждения при компиляции.
// Optput:
// 2 5
namespace ScrapCSConsole
{
using System;
interface IMyTest
{
void MyTestMethod(int notOptional, int optional = 5);
}
class MyTest : IMyTest
{
void IMyTest.MyTestMethod(int notOptional, int optional = 9)
{
Console.WriteLine(string.Format("{0} {1}", notOptional, optional));
}
}
class Program
{
static void Main(string[] args)
{
MyTest myTest1 = new MyTest();
// The following line won't compile as MyTest method is not available
// without first casting to IMyTest
//myTest1.MyTestMethod(1);
IMyTest myTest2 = new MyTest();
myTest2.MyTestMethod(2);
}
}
}
В комментариях Мартина ниже приводится подробный пример различных ошибок, и я хочу, чтобы компилятор указывал несоответствующие аргументы по умолчанию. Тем не менее, я использую это в своем коде, потому что это указывает на мое намерение как разработчика на уровне интерфейса и реализации для других разработчиков. –
Интересные связанные вопросы: «[Есть ли какие-либо причины для объявления необязательных параметров в интерфейсе?] (Https: // stackoverflow.com/questions/6752762 /) ", и" [Почему дополнительные параметры C# 4, определенные на интерфейсе, не выполняются при реализации класса?] (https://stackoverflow.com/questions/4922714/), второй - с интересным [ответ от Lippert] (https://stackoverflow.com/a/4923642/1028230). – ruffin