"Common type" of the ternary operator expressions

Ali Çehreli acehreli at yahoo.com
Mon May 24 22:25:28 PDT 2010


Ellery Newcomer wrote:
 > On 05/24/2010 06:36 PM, Ali Çehreli wrote:
 >> Ali Çehreli wrote:
 >>> "Conditional Expressions" on this page covers the ternary operator as
 >>> well:
 >>>
 >>> http://digitalmars.com/d/2.0/expression.html#ConditionalExpression
 >>>
 >>> It says "the second and third expressions are implicitly converted to
 >>> a common type which becomes the result type of the conditional
 >>> expression."
 >>>
 >>> How "common" should the "common type" be? Wouldn't you expect the
 >>> following ternary operator's result be I, instead of Object?
 >>>
 >>> interface I {}
 >>> class A : I {}
 >>
 >> My expectation is that the hierarchy of A should look like this:
 >>
 >> Object
 >> |
 >> I
 >> |
 >> A
 >
 > interfaces are not objects, so crush your expectations.

I guess this is how it actually is:

I Object
\ /
  A

 > Question: what should happen with
 >
 > class A : I, J {}
 > class B : I, J {}

Good point. I think the error message threw me off:

Error: cannot implicitly convert expression (some_condition ? new A : 
new B) of type object.Object to deneme.I

The compiler apparently does go up in the hierarchy, but it favors the 
Object branch. (C++ does not try to find a common ancestor; stays with 
the types A and B.)

Ali


More information about the Digitalmars-d-learn mailing list