<div dir="ltr"><div class="markdown-here-wrapper" style=""><p style="margin:0px 0px 1.2em!important">But it already works without <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">where T != Self</code>. Moreover, I guess, this solution is currently considered “good enough” not to introduce additional complexity to type system.<br>Also, on <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">and</code> and <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">or</code>—the former already exists in the form of <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">&amp;</code>, and the latter is listed in commonly proposed rejected features.</p>
<p style="margin:0px 0px 1.2em!important">2017-02-28 7:23 GMT+03:00 Robert Bennett via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;:</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important">protocol P1 {}

protocol P2 {
        // Now, there&#39;s no ambiguity
        static func +&lt;T: P1 where T != Self&gt;(lhs: Self, rhs: T) -&gt; Self
        static func +&lt;T: P1 where T != Self&gt;(lhs: T, rhs: Self) -&gt; Self
        static func +(lhs: Self, rhs: Self) -&gt; Self
}

struct S: P1, P2 {
        static func +&lt;T: P1 where T != Self&gt;(lhs: T, rhs: S) -&gt; S {
                return rhs
        }
        static func +&lt;T: P1 where T != Self&gt;(lhs: S, rhs: T) -&gt; S {
                return lhs
        }
        static func +(lhs: S, rhs: S) -&gt; S {
                return lhs
        }
}
</code></pre><blockquote style="margin:1.2em 0px;border-left:4px solid rgb(221,221,221);padding:0px 1em;color:rgb(119,119,119);quotes:none">
<p style="margin:0px 0px 1.2em!important">Some thought would have to be given to how to handle subtype relationships — probably you would use the polymorphic type of the object at the call site.</p>
</blockquote>
<div title="MDH:QnV0IGl0IGFscmVhZHkgd29ya3Mgd2l0aG91dCBgd2hlcmUgVCAhPSBTZWxmYC4gTW9yZW92ZXIs
IEkgZ3Vlc3MsIHRoaXMgc29sdXRpb24gaXMgY3VycmVudGx5IGNvbnNpZGVyZWQgImdvb2QgZW5v
dWdoIiBub3QgdG8gaW50cm9kdWNlIGFkZGl0aW9uYWwgY29tcGxleGl0eSB0byB0eXBlIHN5c3Rl
bS48ZGl2PkFsc28sIG9uIGBhbmRgIGFuZCBgb3JgLS10aGUgZm9ybWVyIGFscmVhZHkgZXhpc3Rz
IGluIHRoZSBmb3JtIG9mIGAmYW1wO2AsIGFuZCB0aGUgbGF0dGVyIGlzIGxpc3RlZCBpbiBjb21t
b25seSBwcm9wb3NlZCByZWplY3RlZCBmZWF0dXJlcy48YnI+PGRpdiBjbGFzcz0iZ21haWxfZXh0
cmEiPjxicj48ZGl2IGNsYXNzPSJnbWFpbF9xdW90ZSI+MjAxNy0wMi0yOCA3OjIzIEdNVCswMzow
MCBSb2JlcnQgQmVubmV0dCB2aWEgc3dpZnQtZXZvbHV0aW9uIDxzcGFuIGRpcj0ibHRyIj4mbHQ7
PGEgaHJlZj0ibWFpbHRvOnN3aWZ0LWV2b2x1dGlvbkBzd2lmdC5vcmciIHRhcmdldD0iX2JsYW5r
Ij5zd2lmdC1ldm9sdXRpb25Ac3dpZnQub3JnPC9hPiZndDs8L3NwYW4+OjwvZGl2PjxkaXYgY2xh
c3M9ImdtYWlsX3F1b3RlIj5gYGA8L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9xdW90ZSI+cHJvdG9j
b2wgUDEge308YnI+PGJyPnByb3RvY29sIFAyIHs8YnI+Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5i
c3A7IC8vIE5vdywgdGhlcmUncyBubyBhbWJpZ3VpdHk8YnI+Jm5ic3A7ICZuYnNwOyAmbmJzcDsg
Jm5ic3A7IHN0YXRpYyBmdW5jICsmbHQ7VDogUDEgd2hlcmUgVCAhPSBTZWxmJmd0OyhsaHM6IFNl
bGYsIHJoczogVCkgLSZndDsgU2VsZjxicj4mbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgc3Rh
dGljIGZ1bmMgKyZsdDtUOiBQMSB3aGVyZSBUICE9IFNlbGYmZ3Q7KGxoczogVCwgcmhzOiBTZWxm
KSAtJmd0OyBTZWxmPGJyPiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyBzdGF0aWMgZnVuYyAr
KGxoczogU2VsZiwgcmhzOiBTZWxmKSAtJmd0OyBTZWxmPGJyPn08YnI+PGJyPnN0cnVjdCBTOiBQ
MSwgUDIgezxicj4mbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgc3RhdGljIGZ1bmMgKyZsdDtU
OiBQMSB3aGVyZSBUICE9IFNlbGYmZ3Q7KGxoczogVCwgcmhzOiBTKSAtJmd0OyBTIHs8YnI+Jm5i
c3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyByZXR1
cm4gcmhzPGJyPiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyB9PGJyPiZuYnNwOyAmbmJzcDsg
Jm5ic3A7ICZuYnNwOyBzdGF0aWMgZnVuYyArJmx0O1Q6IFAxIHdoZXJlIFQgIT0gU2VsZiZndDso
bGhzOiBTLCByaHM6IFQpIC0mZ3Q7IFMgezxicj4mbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsg
Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IHJldHVybiBsaHM8YnI+Jm5ic3A7ICZuYnNwOyAm
bmJzcDsgJm5ic3A7IH08YnI+Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IHN0YXRpYyBmdW5j
ICsobGhzOiBTLCByaHM6IFMpIC0mZ3Q7IFMgezxicj4mbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJz
cDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IHJldHVybiBsaHM8YnI+Jm5ic3A7ICZuYnNw
OyAmbmJzcDsgJm5ic3A7IH08YnI+fTxicj5gYGA8L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9xdW90
ZSI+PGJyPiZndDsgU29tZSB0aG91Z2h0IHdvdWxkIGhhdmUgdG8gYmUgZ2l2ZW4gdG8gaG93IHRv
IGhhbmRsZSBzdWJ0eXBlIHJlbGF0aW9uc2hpcHMg4oCUIHByb2JhYmx5IHlvdSB3b3VsZCB1c2Ug
dGhlIHBvbHltb3JwaGljIHR5cGUgb2YgdGhlIG9iamVjdCBhdCB0aGUgY2FsbCBzaXRlLjwvZGl2
PjwvZGl2PjwvZGl2Pg==" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0">​</div></div></div>