Benji Smith wrote:
Don wrote:
Denis Koroskin wrote:
Foo nonNull = new Foo();
Foo? possiblyNull = null;
 >
Wouldn't this cause ambiguity with the "?:" operator?

At first, thought you might be right, and that there would some ambiguity calling constructors of nullable classes (especially given optional parentheses).

But for the life of me, I couldn't come up with a truly ambiguous example, that couldn't be resolved with an extra token or two of lookahead.

The '?' nullable-type operator is only used in type declarations, not in expressions, and the '?:' operator always consumes a few trailing expressions.

Also (at least in C#) the null-coalesce operator (which converts nullable objects to either a non-null instance or a default value) looks like this:

  MyClass? myNullableObj = getNullableFromSomewhere();
  MyClass myNonNullObj = myNullableObj ?? DEFAULT_VALUE;

Since the double-hook is a single token, it's also unambiguous to parse.

--benji

Disclaimer: I'm not an expert on compilers.  Plus, I just got up.  :P

The key is that the parser has to know what "MyClass" means before it can figure out what the "?" is for; that's why it's context-dependant. D avoids this dependency between compilation stages, because it complicates the compiler. When the parser sees "MyClass", it *doesn't know* that it's a type, so it can't distinguish between a nullable type and an invalid ?: expression.

At least, I think that's how it works; someone feel free to correct me if it's not. :P

  -- Daniel

Reply via email to