switch(string)

Robert Fraser fraserofthenight at gmail.com
Wed Jun 18 02:37:14 PDT 2008


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.


More information about the Digitalmars-d-learn mailing list