【发布时间】:2012-11-23 21:38:21
【问题描述】:
我可以解决这个问题,但我很好奇为什么它不起作用:
与您可以为例程创建具有默认值的可选参数相同的方式,例如下面的.....
public void SomeRoutine(string Title = "Missing")
{
// Do something with Title
}
....为什么不能将默认类型指定为可选参数?
以下示例给出了错误:“'theType' 的默认参数必须是编译时间常数。”
public void SomeOtherRoutine(Type theType = typeof(MyClass))
{
// Do something based on theType
}
实际的应用程序试图提供枚举包含基类和各种派生类混合的集合的选项,并仅返回感兴趣的类类型:
public IEnumerable<MyBaseClass> EnumerateWithOptions(Type optionalDerivedClass = typeof(MyBaseClass))
{
foreach (MyBaseClass thingy in MyCustomCollection())
{
if (thingy.GetType() == optionalDerivedClass)
{ yield return thingy; };
}
}
显而易见的替代方法是重载例程以应用默认值,如下所示,但是由于不值得尝试描述的原因,它在我的应用中并不理想。
public IEnumerable<MyBaseClass> EnumerateWithOptions()
{
return EnumerateWithOptions(typeof(MyBaseClass));
}
public IEnumerable<MyBaseClass> EnumerateWithOptions(Type optionalDerivedClass)
{
foreach (MyBaseClass thingy in MyCustomCollection())
{
if (thingy.GetType() == optionalDerivedClass)
{ yield return thingy; };
}
}
关于为什么 typeof(MyClass) 不被视为编译时间常数的任何想法,或者对不同方法的任何想法?谢谢。
【问题讨论】:
-
如果您提供默认值,编译器将为您创建重载。因此,我通常避免提供默认值,而是使用重载方法。
-
感谢您的评论。当有多个具有默认值的参数时,重载在逻辑上与默认值不同。我提供的示例没有显示它,但是应用程序在 EnumerateWithOptions 例程中有几个参数,每个参数都有默认值 - 包括枚举方向、行 vs 列第一次扫描、子包含、重复键迭代器等。试图表达所有作为重载的选项组合太多了。
标签: c# types parameters default optional