真正奇怪的是,您在接口中为可选参数输入的值实际上有所不同。我想您必须质疑该值是接口详细信息还是实现详细信息。我会说后者,但事情表现得像前者。例如,以下代码输出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);
}
}
}
有趣的是,如果您的接口使参数成为可选参数,则实现该参数的类不必这样做:
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();
IMyTest myTest2 = myTest1;
myTest2.MyTestMethod(2);
}
}
}
但是,似乎有一个错误是,如果您明确实现接口,则您在类中为可选值提供的值是没有意义的。在下面的示例中,如何使用值9?
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();
IMyTest myTest2 = new MyTest();
myTest2.MyTestMethod(2);
}
}
}
埃里克·利珀特(Eric Lippert)就这个确切的话题写了一个有趣的系列文章:可选的论点角落案例