switch(string)

David Ferenczi raggae at ferenczi.net
Wed Jun 18 02:38:55 PDT 2008


Robert Fraser wrote:

> David Ferenczi wrote:
>> Robert Fraser wrote:
>> 
>>> David Ferenczi wrote:
>>>> The following code gives the following compilation error:
>>>>
>>>> Error: case must be a string or an integral constant, not BAR1
>>>> Error: case must be a string or an integral constant, not BAR2
>>>>
>>>> --------------------------8<------------------------------------
>>>> int main(string[] args)
>>>> {
>>>>     string BAR1 = "bar1";
>>>>     string BAR2 = "bar2";
>>>>     string myString = "bar3";
>>>>
>>>>     switch (myString)
>>>>     {
>>>>         case BAR1:
>>>>             break;
>>>>
>>>>         case BAR2:
>>>>             break;
>>>>
>>>>         defualt:
>>>>             break;
>>>>     }
>>>>
>>>>     return 0;
>>>> }
>>>> --------------------------8<------------------------------------
>>>>
>>>> Can somebody explain me why?
>>>>
>>>> Thanks,
>>>> David
>>> BAR1 and BAR2 are not constant. In D1, try:
>>>      const BAR1 = "bar1";
>>> In D2, you can also try:
>>>      invariant BAR1 = "bar1";
>>>      enum BAR1 = "bar1";
>>> The enum version and the const version in D1 will not take up any
>>> storage.
>> 
>> Thank you very much for the quick reply. Does it mean that a
>> constant/invariant doesn't need an explicit storage type?
> 
> Yes, but you can write it as:
> 
> invariant string BAR1 = "bar1";
> 
> If "string" isn't specified it will be deduced.
> 
>> I thought that string was invariant, so it was constant. Isn't it right?
> 
> string is invariant(char)[]. So the letters are constant, but not the
> reference. This means:
> 
> string x = "abc";
> x[2] ='d'; // ERROR
> x = "abd"; // Okay
> 
> It's kind of confusing at first, and I have yet to be convinced of its
> usefulness, but there ya go.

Thank you very much! :-) I'm on the way to clarity. ;-)


More information about the Digitalmars-d-learn mailing list