www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 17552] New: Cannot implicitly convert expression (struct this)

https://issues.dlang.org/show_bug.cgi?id=17552

          Issue ID: 17552
           Summary: Cannot implicitly convert expression (struct this)
           Product: D
           Version: D2
          Hardware: x86
                OS: All
            Status: NEW
          Severity: normal
          Priority: P1
         Component: dmd
          Assignee: nobody puremagic.com
          Reporter: andre s-e-a-p.de

I created a custom type which enables me to have enums which have as their
initial state, the init value of their base type. Something similiar to
Nullable...

enum Reason : string {CO = "Co", FU = "Fu", CA = "Ca"}
struct TestStruct {InitialEnum!Reason reason;}

This line raises the error:
TestStruct s2 = TestStruct(Reason.FU);
 Error: cannot implicitly convert expression ("Fu") of type Reason to
InitialEnum!(Reason)
While this line is working fine: TestStruct s1 = {reason: Reason.FU}; I asked this question in the learning forum and got the advice to create an issue. struct InitialEnum(T) { import std.traits: OriginalType, EnumMembers; import std.conv: to; private T _value; private bool _isEmpty = true; alias EnumBaseType = OriginalType!T; property EnumBaseType baseTypeValue() { return (_isEmpty) ? EnumBaseType.init : _value; } property T value() { return _value; } property bool isEmpty() { return _isEmpty; } alias baseTypeValue this; void opAssign(EnumBaseType value) { if (value == EnumBaseType.init) { _isEmpty = true; return; } foreach (member; EnumMembers!T) { if (value == member) { _value = member; _isEmpty = false; return; } } throw new Exception("Value "~value.to!string~" is not a valid enum value"); } this(T t) { _isEmpty = false; _value = t; } this(EnumBaseType value) { opAssign(value); } } --
Jun 25 2017