On Monday, February 27, 2012 17:44:40 Pedro Lacerda wrote: > The expression "[] is null" evaluates to true here using 2.058, but I > expected to be false. What am I missing?
Arrays treat null kind of funny. For equality, null is considered to be the same as an array with length 0. So, int[] a; assert(a.length == 0); assert(a == null); If you want to specifically check that an array's ptr property is null, then you can use is: int[] a; assert(a is null); Where the difference tends to come in is if an array was allocated and then shrunk down to length 0: int a[]; assert(a.length == 0); assert(a == null); assert(a is null); a.length = 5; a.length = 0; assert(a.length == 0); assert(a == null); assert(a !is null); But because null and empty aren't really treated differently for the most part, it's generally unwise to care about null and empty being different for arrays. A possible exception is a function which specifically returns a null array under some set of circumstances (IIRC some functions in std.path do this). But the wisdom of even that is debatable. As for null vs [], I'm not aware of the spec really specifying whether "[] is null" or not. "[] == null" is definitely guaranteed, but I think that it may have even changed before whether "[] is null" is true or not. But it may be defined in the spec, I don't know. Certainly, I don't find it surprising that "[] is null", simply because it's more efficient (since then no memory has to be allocated to the array's ptr property), and the differences between null and empty are largely ignored for arrays anyway. - Jonathan M Davis