June 25, 2017 [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); } } -- |
Copyright © 1999-2021 by the D Language Foundation