两端可选参数

发布于 2024-10-17 09:27:15 字数 424 浏览 2 评论 0原文

static void F(string ham, object jam = null) { }  
static void F(string spam, string ham, object jam = null) { }  
...  
F("meat product", null);

这个奇怪代码的开发者显然试图在两端设置可选参数;目的是垃圾邮件和果酱都是可选的,但火腿始终是必需的。

编译器选择哪个重载,为什么?

我从 Eric Lippert 的博客

static void F(string ham, object jam = null) { }  
static void F(string spam, string ham, object jam = null) { }  
...  
F("meat product", null);

The developer of this odd code is apparently attempting to make optional parameters on both ends; the intention is that both spam and jam are optional, but ham is always required.

Which overload does the compiler pick, and why?

(I got the question from blog of Eric Lippert)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

许一世地老天荒 2024-10-24 09:27:15

选择第二个重载。 (有没有感到惊讶?)

原因很简单。这
重载解析算法有两种
候选人,并且必须选择哪一个是
最好的一个基础上
从参数到
形式参数类型。看看
第一个论点。要么是转换了
串起来,或者……串起来。哼。我们
从中无法得出任何结论
争论,所以我们忽略它。

现在考虑第二个参数。我们
要么将 null 转换为对象,如果我们
选择第一个重载,或者串起来,
如果我们选择第二个过载。细绳
显然比
目的;每个字符串都是一个对象,但是
并非每个对象都是字符串。我们
努力选择过载
更具体,所以我们选择第二个
过载,并调用

F("meat product", null, null);

http ://blogs.msdn.com/b/ericlippert/archive/2011/02/10/optional-arguments-on-both-ends.aspx

The second overload is chosen. (Were you surprised?)

The reason why is straightforward. The
overload resolution algorithm has two
candidates and must pick which is the
best one on the basis of the
conversions from the arguments to the
formal parameter types. Look at the
first argument. Either it is converted
to string, or to... string. Hmph. We
can conclude nothing from this
argument, so we ignore it.

Now consider the second argument. We
either convert null to object, if we
pick the first overload, or to string,
if we pick the second overload. String
is obviously more specific than
object; every string is an object, but
not every object is a string. We
strive to pick the overload that is
more specific, so we choose the second
overload, and call

F("meat product", null, null);

http://blogs.msdn.com/b/ericlippert/archive/2011/02/10/optional-arguments-on-both-ends.aspx

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文