我知道这不是一个真实世界的问题,但我想知道:在没有反射/技巧的情况下,是否可以访问具有所有默认参数的索引器?
例如如何调用:
public int this[string val="", int sth=5]
{
get
{
return 0;
}
set
{
}
}
不显式提供参数怎么办?
我会考虑类似于myobject[]
的东西,但这显然是不正确的。
为什么编译器不警告我没有意义?
我知道这不是一个真实世界的问题,但我想知道:在没有反射/技巧的情况下,是否可以访问具有所有默认参数的索引器?
例如如何调用:
public int this[string val="", int sth=5]
{
get
{
return 0;
}
set
{
}
}
不显式提供参数怎么办?
我会考虑类似于myobject[]
的东西,但这显然是不正确的。
为什么编译器不警告我没有意义?
Dim obj As New Foo
obj = Nothing
问题在于,如果你仔细想想,这是完全有道理的。
整个问题基于从C++中采取的一些习惯。如果您有默认参数,则它们将放在参数列表的末尾。在C#中也是如此。
C++和C#之间的主要区别在于,在后者中,您可以通过名称访问方法参数!与C++不同,在C#中,您可以按任意顺序提供所有参数:
class Sth
{
public int this[string val="", int sth=5]
{
get
{
return 0;
}
set
{
}
}
public Sth()
{
var i = this[sth: 6];
}
}
在标准的C++中,这种表示法是不可能的。
因此,即使我们为索引器的每个参数都设置了默认值,如果我们想要使用其中一个(或子集)参数运行它,这仍然是有意义的。
这自然而然地引出了第二个问题:只有一个带有默认值的参数的索引器怎么样?
class Sth
{
public int this[int sth=5]
{
get
{
return 0;
}
set
{
}
}
}
世界依然保持着理智。虽然我们实际上无法以“正确的方式”(即不使用反射或其他hacky机制)使用索引器,但我们会收到警告。在Mono(可能也适用于.NET),它看起来像这样:
警告CS1066:为可选参数'sth'指定的默认值将永远不会被使用(CS1066)
如果我们不提供参数的显式值,我们实际上无法调用它。
如果我先考虑单参数索引器,整个问题将会更容易解决。但是,好吧,我没有想到。;-)