UFCS and overloading
Szymon Gatner via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Mon Apr 6 11:00:44 PDT 2015
On Monday, 6 April 2015 at 17:53:13 UTC, Steven Schveighoffer
wrote:
> On 4/6/15 12:23 PM, Szymon Gatner wrote:
>> Hi,
>>
>> I am surprised that this doesn't work:
>>
>> class Foo
>> {
>> void bar(string) {}
>> }
>>
>> void bar(Foo foo, int i)
>> {
>> }
>>
>> auto foo = new Foo();
>> foo.bar(123); // <=== error
>>
>> causing compilation error:
>>
>> main.d(24): Error: function main.Foo.bar (string _param_0) is
>> not
>> callable using argument types (int)
>>
>> does UFCS now work with method overloading? I know it is not a
>> syntax
>> error because changing the name of int version of bar to bar2
>> and
>> calling foo.bar2(123) works fine.
>
> You can't do this. UFCS cannot add overloads, it can only add
> whole overload sets (if not already present).
>
> -Steve
Why is that? The use case is to provide a set of convenience
"extension methods" to a basic interface. Say, given:
interface Subject
{
void add(SomeInterface obj);
}
// and then
void add(Subject a, Type1 v1)
{
a.add(convertToSomeInterface(v1));
}
void add(Subject a, Type2 v2)
{
a.add(convertToSomeInterface(v2));
}
this way client can just implement Subject interface and still
use it with types Type1 and Type2. C# allows that, why D does not?
More information about the Digitalmars-d-learn
mailing list