Hi,
I have some weird compiler behaviour, so I'm hoping that one of the gurus
here will be able to tell me whether or not it really is a compiler bug.
In short, the compiler is saying that it cannot choose between two
overloaded versions of a method when, IMHO, one overload is clearly a
"better" choice than the other. I've looked through all the rules for
overload resolution, and I can't see any justification for the compiler's
error message.
I'll include a stripped down demonstration of the "bug" below. But first, a
"disclaimer ": yes, I have included an implict conversion operator on one of
the classes and yes, the problem does go away if I remove it. However,
regardless of the fact that I've included it, I still believe the compiler is
wrong about the ambiguity.
What do you think?
Here's the code:
public class A
{
public static implicit operator B(A a)
{
return new B(); //actual implementation omitted
}
}
public class B
{
}
public class ShowError
{
public static void Method(A a, B b)
{ }
public static void Method(B b, A a)
{ }
public static void ThisFailsToComp ile()
{
A a = new A();
Method(a, null);
//Compiler says this call is ambiguous, BUT
//Surely Method(A a, B b) is better than Method(B b, A a)
//since the former requires NO implicit conversion of the first
param
}
}
John 18 1385
John,
Do not matter if you give Method(a, null); or Method(null, a) either way it
is not clear to the compiler if it is Method((B)a, null) or Method(a, null)
should be called. Guidelines for implicit maintions that implicit conversion
should be very clear and should not create confusion. In this case it is
confusing.
Thanks,
Po
"John Rusk" <Jo******@discu ssions.microsof t.com> wrote in message
news:51******** *************** ***********@mic rosoft.com... Hi,
I have some weird compiler behaviour, so I'm hoping that one of the gurus here will be able to tell me whether or not it really is a compiler bug.
In short, the compiler is saying that it cannot choose between two overloaded versions of a method when, IMHO, one overload is clearly a "better" choice than the other. I've looked through all the rules for overload resolution, and I can't see any justification for the compiler's error message.
I'll include a stripped down demonstration of the "bug" below. But first, a "disclaimer ": yes, I have included an implict conversion operator on one of the classes and yes, the problem does go away if I remove it. However, regardless of the fact that I've included it, I still believe the compiler is wrong about the ambiguity.
What do you think?
Here's the code:
public class A { public static implicit operator B(A a) { return new B(); //actual implementation omitted } }
public class B { }
public class ShowError { public static void Method(A a, B b) { }
public static void Method(B b, A a) { }
public static void ThisFailsToComp ile() { A a = new A(); Method(a, null); //Compiler says this call is ambiguous, BUT //Surely Method(A a, B b) is better than Method(B b, A a) //since the former requires NO implicit conversion of the first param }
}
John
Po, is not clear to the compiler if it is Method((B)a, null) or Method(a, null) should be called.
IMHO, the C# documentation says that Method(a, null) is the better match
because its first parameter if already of the correct type. That makes it
better than Method((B)a, null), in which the first parameter requires
conversion. Therefore, according to the documentation, the compiler should
automatically choose Method(a, null).
Guidelines for implicit maintions that implicit conversion should be very clear and should not create confusion. In this case it is confusing.
For humans, yes! My point is that, according to the documentation, it
should _not_ confuse the compiler.
John
PS: I do have good reasons for writing such "confusing" code; I just don't
have time and space to describe them here. Anyway, the point is that the
_compiler_ should not get confused.
John Rusk <Jo******@discu ssions.microsof t.com> wrote: I have some weird compiler behaviour, so I'm hoping that one of the gurus here will be able to tell me whether or not it really is a compiler bug.
No, it's not a bug, although it's subtle.
The first argument favours Method(A, B). However, look at the second
argument, with respect to the list of "better" conversions, where T1 is
A, T2 is B, C1 is the conversion from the null type to A, C2 is the
conversion from the null type to B, and S is the null type.
o T1 and T2 are different conversions (no result)
o S is neither T1 nor T2 (no result)
o There *is* an implicit conversion from T1 to T2, and no implicit
conversion from T2 to T1, so C1 is the better conversion.
So, for the second argument, Method(B,A) is preferred - so the compiler
doesn't know what to do.
Hope that helps - let me know if you want me to go through it in more
detail. (It looks like you've spent time poring over the specs already,
so hopefully the above should be pretty straightforward by now!)
--
Jon Skeet - <sk***@pobox.co m> http://www.pobox.com/~skeet Blog: http://www.msmvps.com/jon.skeet
If replying to the group, please do not mail me too
Jon Skeet [C# MVP] <sk***@pobox.co m> wrote:
<snip> Hope that helps - let me know if you want me to go through it in more detail. (It looks like you've spent time poring over the specs already, so hopefully the above should be pretty straightforward by now!)
Meant to ask before - would you like me to add a comment on this for
the specification committee? I happen to be looking through the C# 2.0
specs at the moment, and have collected some comments for them. This
strikes me as an area which could do with at least a bit more
explanation - would you mind if I used your example code?
--
Jon Skeet - <sk***@pobox.co m> http://www.pobox.com/~skeet Blog: http://www.msmvps.com/jon.skeet
If replying to the group, please do not mail me too
PS For the record, I've just found a way to resolve the ambiguity in the
example I gave. It ain't pretty, but it's working.
It relies on two facts: firstly, the problem case is when the "b" param is
the null literal. Secondly, we cannot resolve the ambiguity but we _can_
break the "tie" by introducing a third method which is an even _better_
match, in the specific case when the b param is null.
First, I added this class to the project:
public class NullObj
{
private NullObj() //private = no way to construct this class
{ }
public static implicit operator B(NullObj n)
{
return null;
}
}
There's no way to construct it, so the only possible "value" for a
variable/param of this type is "null".
Second, I added two more overrides of the problem method. They look like
this:
public static void Method(A a, NullObj n)
{
Method(a, (B)null);
}
public static void Method(NullObj n, A a)
{
Method((B)null, a);
}
These overrides will "win" when code calls Method(a, null) and Method(null,
a).
E.g. given the call
Method(a, null)
and the following signatures:
1. Method(B b, A a)
2. Method(A a, B a)
3. Method(A a, NullObj n)
#3 wins because compared to #1, its first param is a better conversion and
its second param is no worse; and compared to #2, its first param is no worse
and its second param is a better conversion - due to the one-way implicit
conversion from NullObj to B.
As you know, that conversion is never actually used. The solution still
works even if the new implicit conversion is coded like this:
public static implicit operator B(NullObj n)
{
throw new NotImplementedE xception();
}
In summary, it's kind of ugly but kind of cool too ;-)
In case anyone else ever has this problem, likely Google search strings are
the C# compiler error message, namely: CS0121 (or 0121 or 121) The call is
ambiguous between the following methods or properties.
> > Hope that helps - let me know if you want me to go through it in more detail. (It looks like you've spent time poring over the specs already, so hopefully the above should be pretty straightforward by now!)
Yes, but when I re-read them yesterday I missed the crucial bit :-) Thanks
for pointing it out.
Meant to ask before - would you like me to add a comment on this for the specification committee? I happen to be looking through the C# 2.0 specs at the moment, and have collected some comments for them. This strikes me as an area which could do with at least a bit more explanation - would you mind if I used your example code?
You're welcome to use my example code. Perhaps it would help if the
reasoning behind this rule was explained a bit more, that might make it
easier it remember.
Regards,
John
John Rusk <Jo******@discu ssions.microsof t.com> wrote: Hope that helps - let me know if you want me to go through it in more detail. (It looks like you've spent time poring over the specs already, so hopefully the above should be pretty straightforward by now!) Yes, but when I re-read them yesterday I missed the crucial bit :-) Thanks for pointing it out.
No problem. I love this kind of question. (Bit sad, I know.)
Meant to ask before - would you like me to add a comment on this for the specification committee? I happen to be looking through the C# 2.0 specs at the moment, and have collected some comments for them. This strikes me as an area which could do with at least a bit more explanation - would you mind if I used your example code?
You're welcome to use my example code. Perhaps it would help if the reasoning behind this rule was explained a bit more, that might make it easier it remember.
Exactly. I can't see why it's there, at the moment. No doubt it'll all
make sense with a bit of explanation.
--
Jon Skeet - <sk***@pobox.co m> http://www.pobox.com/~skeet Blog: http://www.msmvps.com/jon.skeet
If replying to the group, please do not mail me too
"Jon Skeet [C# MVP]" <sk***@pobox.co m> wrote in message
news:MP******** *************** *@msnews.micros oft.com... John Rusk <Jo******@discu ssions.microsof t.com> wrote: > > Hope that helps - let me know if you want me to go through it in more > > detail. (It looks like you've spent time poring over the specs > > already, > > so hopefully the above should be pretty straightforward by now!)
Yes, but when I re-read them yesterday I missed the crucial bit :-) Thanks for pointing it out.
No problem. I love this kind of question. (Bit sad, I know.)
> Meant to ask before - would you like me to add a comment on this for > the specification committee? I happen to be looking through the C# 2.0 > specs at the moment, and have collected some comments for them. This > strikes me as an area which could do with at least a bit more > explanation - would you mind if I used your example code?
You're welcome to use my example code. Perhaps it would help if the reasoning behind this rule was explained a bit more, that might make it easier it remember.
Exactly. I can't see why it's there, at the moment. No doubt it'll all make sense with a bit of explanation.
Perhaps. The oddities that result from discarding overrides before finding
the best match don't seem to make much sense. ( http://tinyurl.com/ckd8e, if
it's been too long.)
Mike Schilling <ms************ *@hotmail.com> wrote: Exactly. I can't see why it's there, at the moment. No doubt it'll all make sense with a bit of explanation.
Perhaps. The oddities that result from discarding overrides before finding the best match don't seem to make much sense. (http://tinyurl.com/ckd8e, if it's been too long.)
Don't worry - that was one of the first things I commented on :)
(And it's surprised everyone I've shown it to so far...)
--
Jon Skeet - <sk***@pobox.co m> http://www.pobox.com/~skeet Blog: http://www.msmvps.com/jon.skeet
If replying to the group, please do not mail me too This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics |
by: Jeff Epler |
last post by:
Hello.
Recently, Generator Comprehensions were mentioned again on python-list.
I have written an implementation for the compiler module. To try it
out, however, you must be able to rebuild Python from source, because it
also requires a change to Grammar.
1. Edit Python-2.3/Grammar/Grammar and add an alternative to the
"listmaker" production:
-listmaker: test ( list_for | (',' test)* )
|
by: Tao Wang |
last post by:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Hi,
I saw cuj's conformance roundup, but the result is quite old. I think
many people like me want to know newer c++ standard conformance test
result. Especially, I want to know the compiler conformance of vc7.1,
vc8.0, gcc 4.x and intel c++, and also each implementation of STL. The
world is moving on, right? :)
|
by: pj |
last post by:
(Was originally, probably wrongly, posted to the vc subgroup.)
(This doesn't appear to be a c# problem, but a problem with a bug in
the Visual Studio c# compiler, but, any help will be welcome...)
Oh, I forgot to list the error messages; I would be delighted if
someone could explain how to deduce which line number in which file is
the one that the VC compiler cannot handle. Actually I'm using C#, but
the only post I could find about...
|
by: rollasoc |
last post by:
Hi,
I seem to be getting a compiler error
Internal Compiler Error (0xc0000005 at address 535DB439): likely culprit is
'BIND'.
An internal error has occurred in the compiler. To work around this problem,
try simplifying or changing the program near the locations listed below.
Locations at the top of the list are closer to the point at which the
|
by: Mark Rockman |
last post by:
------ Build started: Project: USDAver2, Configuration: Debug .NET ------
Preparing resources...
Updating references...
Performing main compilation...
error CS0583: Internal Compiler Error (0xc0000005 at address 535F072A): likely culprit is 'BIND'.
An internal error has occurred in the compiler. To work around this problem, try simplifying or changing the program near the locations listed below. Locations at the top of the list are...
| |
by: Timur Safin |
last post by:
Hi All,
Sorry if it is offtopic here, I wasn't able to find any more relevant group...
I'm slowly approaching AMD64 build for our product (as my personal fun project). And after
I ran that Amd64 cross-compiler from DDK 3790 build (proven to be good enough for my
driver stuff) over the sources I've updated shortly I've found this serious assertion
appearing in manyplaces of the code we have:
$ tcc.ver edzunet build5105
|
by: skip |
last post by:
Here's a trivial little Python session which attempts to use compiler.walk
(mostly unsuccessfully):
% python
Python 2.4.2 (#1, Feb 23 2006, 12:48:31)
on sunos5
Type "help", "copyright", "credits" or "license" for more information.
Module(None, Stmt(, Const('red')), Assign(, Const('blue'))]))
<compiler.visitor.ExampleASTVisitor instance at 0x81f0eac>
|
by: toton |
last post by:
Hi,
Anyone have a link to comparative study of different C++ compilers
and how much they conform to C++ language standard? Most of the big
platforms I know have GCC which well supports C++ standard. But mainly
looking for compilers for small platforms like ARM, XScale, OMAP
processors, and mobile OS's. I am not getting enough imformation which
of the platforms HAVE a C++ compiler/cross compiler and how much they
support C++ standard.
It...
|
by: Miroslaw Makowiecki |
last post by:
Where can I download Comeau compiler as a trial version?
Thanks in advice.
|
by: Dave |
last post by:
I'm having a hard time tying to build gcc 4.3.1 on Solaris using the GNU
compilers. I then decided to try to use Sun's compiler. The Sun Studio
12 compiler reports the following code, which is in the source
(gcc-4.3.1/gcc/c-common.c) of gcc 4.3.1, is a syntax error.
I'm inclined to agree, as it is like no C I have ever met.
what is "C_COMMON_FIXED_TYPES (, fract);" supposed to mean? Could it be
|
by: Hystou |
last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it.
First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
| |
by: jinu1996 |
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth.
The Art of Business Website Design
Your website is...
|
by: Hystou |
last post by:
Overview:
Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
|
by: tracyyun |
last post by:
Dear forum friends,
With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
|
by: agi2029 |
last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then launch it, all on its own....
Now, this would greatly impact the work of software developers. The idea...
|
by: conductexam |
last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one.
At the time of converting from word file to html my equations which are in the word document file was convert into image.
Globals.ThisAddIn.Application.ActiveDocument.Select();...
|
by: TSSRALBI |
last post by:
Hello
I'm a network technician in training and I need your help.
I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs.
The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols.
I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
| |
by: 6302768590 |
last post by:
Hai team
i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
|
by: bsmnconsultancy |
last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...
| |