<div dir="ltr">+1<div>It has nagged at me that this can happen even though I understood *why* it happens.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jun 2, 2016 at 6:22 PM, John McCall via swift-evolution <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">&gt; On Jun 2, 2016, at 2:43 PM, Brent Royal-Gordon &lt;<a href="mailto:brent@architechies.com">brent@architechies.com</a>&gt; wrote:<br>
&gt;&gt; In my opinion, using this initializer-call syntax to build an explicitly-typed literal is an obvious and natural choice with several advantages over the &quot;as&quot; syntax.  However, even if you disagree, it&#39;s clear that programmers are going to continue to independently try to use it, so it&#39;s really unfortunate for it to be subtly wrong.<br>
&gt;<br>
&gt; I&#39;ve seen developers do this; in one memorable case, it resulted in Swift taking a ridiculously long time to typecheck an expression, since the seemingly pinned-down types of the literals had actually become *more* ambiguous, not less.<br>
<br>
</span>Yes, this would also tend to improve compile times, since currently we end up generating a massively-ambiguous constraint system which must be resolved by type defaulting.  That&#39;s not really why I&#39;m proposing this, though.<br>
<span class=""><br>
&gt; However, it&#39;s not difficult to teach developers to use `as`. Usually what&#39;s happening is that their mental model of the language is wrong: they think of `UInt16(foo)` as a cast to a primitive type, and are surprised to learn that it&#39;s actually an initializer on a struct and they&#39;re initializing an instance. Learning this helps them understand how the language works, what the difference is between initializers and `as`, and how they can write the same things they see in the standard library types.<br>
<br>
</span>So, you think that this syntax is enticing to new developers who naturally think that the feature works the way that I&#39;m proposing it should work, and you think that the right solution is to make the syntax illegal so that you can more conveniently tell them it doesn&#39;t work that way? :)<br>
<br>
You can still tell them that it&#39;s a struct and you&#39;re calling an initializer on it; it&#39;s just that the initializer chosen is the special literal initializer because the argument is a literal.<br>
<span class="HOEnZb"><font color="#888888"><br>
John.<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
<br>
<br>
&gt;<br>
&gt; I think *actually* turning this into magic would be counterproductive. The better solution is to make the compiler replace me in that story, by having it emit a warning with a fix-it. It keeps initializer calls meaning exactly what they say. (And it doesn&#39;t require an evolution proposal to do, since you can add a warning with a mere bug.)<br>
&gt;<br>
&gt;       UInt16(42)<br>
&gt;       ^~~~~~ ^~<br>
&gt;       Use of initializer with integer literal does not cast &#39;42&#39; to &#39;UInt16&#39;<br>
&gt;       Fix-It: Replace with &#39;42 as UInt16&#39;<br>
&gt;<br>
&gt; --<br>
&gt; Brent Royal-Gordon<br>
&gt; Architechies<br>
&gt;<br>
<br>
_______________________________________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
</div></div></blockquote></div><br></div>