On Monday, 27 August 2018 at 12:54:59 UTC, SG wrote:
On Monday, 27 August 2018 at 03:21:04 UTC, rikki cattermole wrote:
Templates make it the easiest way, since common patterns, like arrays, classes and pointers have the exact same null check syntax.

I see.

That code is only for classes. C# also has structs which are a value type. Which it would not work for.

The same thing for struct in C#

Struct S{
   public int? i;
}

S.i == null; // This works nicely.

You don't need isNull function for Nullable because it has a method called it. That will be preferred (hence I specifically used isNull as the name).

For Variant, use hasValue.

bool isNull(Variant value) {
        return !value.hasValue;
}

The problem I'm trying to solve is beyond that. This is just an example. But bear with me, right now all I want is a function to check the value from 'a' type and return if it is null.

The type could be a: Class, Struct, a Basic data type, Variant, Nullable and so.

And what I see, these types has different behaviors, while in C# at least for this same case, I would write the same thing in few lines to perform it, in D I found very hard.

Isn't counter intuitive the way D works? Because for each type Class/Nullable you check with .isNull, for Variant with .hasValue, for string (variable is null).

Thanks.

hasValue isn't equivalent of isNull or is null. 'null' is valid value in Variant:


        import std.variant;
        Variant v;

        v = null;
        assert(v.hasValue);                    //v has value
assert(v.get!(typeof(null)) is null); //value in v is null

Nullable!T.isNull isn't equivalent of is null:

        int* i = null;
        Nullable!(int*) ni;
        ni = i;
        assert(ni.isNull == false);     ///ni has value
        assert(ni is null);             ///ni value is null

string is null isn't equivalent of empty:

        string str = "test";
        str = str[0 .. 0];
        assert(str !is null);   ///str isn't null
        assert(str.empty);      ///str is empty


Reply via email to