【问题标题】:Overriding default parameters in C# [duplicate]覆盖 C# 中的默认参数 [重复]
【发布时间】:2014-01-05 04:55:06
【问题描述】:

复制真的很简单,输出很奇怪;

预期的输出是“bbb bbb” 实际输出为“aaa bbb”

有人对这种行为有任何 MSDN 解释吗?我找不到。

((a)new b()).test();
new b().test();


public class a
{
    public virtual void test(string bob = "aaa ")
    {
        throw new NotImplementedException();
    }
}

public class b : a
{
    public override void test(string bob = "bbb ")
    {
        HttpContext.Current.Response.Write(bob);
    }
}

【问题讨论】:

  • 是否 ((a)(new b())).test() 给出了你想要的结果?
  • 根据的预期输出?
  • 我认为在重写方法时更改可选参数的默认值是无效的。这不会改变方法签名吗?
  • @user1567896 如果它无效,我怀疑它会
  • @Frederik 这不是无效,只是可能不明智

标签: c# default-parameters


【解决方案1】:

你为什么期待“bbb bbb”?

由于您将实例转换为a,因此在第一次调用时向编译器提供的唯一信息是带有"aaa" 的版本,因此使用的是那个值

在没有强制转换的第二个版本中,编译器可以看到"bbb",所以使用的是那个值

多态性会影响调用哪个方法 - 但它不会影响传递的参数。本质上,默认值由编译器(在调用站点)提供,因此您的代码实际上相当于:

((a)new b()).test("aaa");
new b().test("bbb");

"aaa""bbb"编译时提供,通过检查解析的方法。

【讨论】:

  • 那么,再次强调一下,默认值是在编译时实现的,而不是在运行时实现的?
  • @BolucPapuccuoglu 是的;我已经添加了更多内容来强调这一点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多