Cra*_*nec 30 c# optional-parameters compiler-warnings c#-4.0
我正在玩可选参数,看看它们如何与接口配合使用,我遇到了一个奇怪的警告.我的设置是以下代码:
public interface ITestInterface
{
void TestOptional(int a = 5, int b = 10, object c = null);
}
public class TestClass : ITestInterface
{
void ITestInterface.TestOptional(int a = 5, int b = 5, object c = null)
{
Console.Write("a=" + a + " b=" + b + " c=" + c);
}
}
Run Code Online (Sandbox Code Playgroud)
编译器给了我以下警告:
如果我使用以下代码运行它:
class Program
{
static void Main(string[] args)
{
ITestInterface test = new TestClass();
test.TestOptional();
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
a=5 b=10 c=
正如我所料,我得到了" " 的输出.
我的问题是什么警告?它指的是什么背景?
Ond*_*cny 23
C#中可选参数的问题在于被调用者是将对象视为a TestClass
还是a ITestInterface
.在第一种情况下,类中声明的值适用.在第二种情况下,接口中声明的值适用.这是因为编译器使用静态可用的类型信息来构造调用.在显式接口实现的情况下,该方法永远不会被称为"一个类",总是"为一个接口"
10.6.1中的C#语言规范指出:
如果可选参数出现在实现部分方法声明(第10.2.7节),显式接口成员实现(第13.4.1节)或单参数索引器声明(第10.9节)中,则编译器应发出警告,因为这些成员永远不能以允许省略参数的方式调用它.
编译器告诉你
void ITestInterface.TestOptional(int a = 5, int b = 5, object c = null)
Run Code Online (Sandbox Code Playgroud)
基本上与
void ITestInterface.TestOptional(int a, int b, object c)
Run Code Online (Sandbox Code Playgroud)
原因是,由于必须通过该接口调用TestOptional,所以该接口将提供参数。在该类上,没有办法为您提供一个参数值。