2017-07-20 50 views
7

Mam wyliczenie, z członkami, które mają tę samą wartość, ale gdy próbowałem wydrukować je jako ciągi, spodziewałem się zobaczyć, że używa pierwszej zdefiniowanej wartości, to jest dla Buy i Bid drukuje Buy, a dla Sell i Ask drukuje Sell, ale test pokazuje, że wygląda losowo, ponieważ nie jest ani pierwszy, ani ostatni dla wszystkich wartości. więc dlaczego ta niekonsekwencja?Dlaczego wartość ciągu Enum jest niespójna?

Sample code:

using System; 

public enum OrderType 
{ 
    Buy, 
    Bid = Buy, 
    Sell, 
    Ask = Sell 
} 

public class Program 
{ 
    public static void Main() 
    { 
     Console.WriteLine("Hello World"); 
     OrderType o = OrderType.Buy; 
     Console.WriteLine("{0}: {1}", (int)o, o); 
     OrderType o2 = OrderType.Bid; 
     Console.WriteLine("{0}: {1}", (int)o2, o2); 
     OrderType o3 = OrderType.Sell; 
     Console.WriteLine("{0}: {1}", (int)o3, o3); 
     OrderType o4 = OrderType.Ask; 
     Console.WriteLine("{0}: {1}", (int)o4, o4); 
    } 
} 

wyjściowa:

Buy: 0 - Bid 
Bid: 0 - Bid 
Sell: 1 - Sell 
Ask: 1 - Sell 
+0

Pytasz, dlaczego zawsze widzisz 'Bid' i' Sell' lub czy otrzymujesz różne odpowiedzi w różnych seriach? –

+0

Moje bezpośrednie pytanie brzmi: dlaczego tak nie jest ("Kup" i "Sprzedaj") lub ("Oferta" i "Zapytaj"), a raczej jest to mieszanka dwóch. Również nie widzę różnych odpowiedzi na różne przebiegi, nie jestem pewien, czy to nie byłem wystarczająco dużo razy, aby przetestować. – fluter

+3

jest to wspomniane w Notatkach dla dzwoniących: https://msdn.microsoft.com/en-us/library/16c1xs4z.aspx#Remarks – Slai

Odpowiedz

5

Zamiast niespójne, warto pomyśleć o tym jako przypadek wyboru dokonywana arbitralnie.

Dokonano wyliczenia, w którym dwie wartości wyliczeniowe oznaczają liczbę całkowitą 0, a dwie wartości oznaczają liczbę całkowitą 1. Tak więc, gdy pojawi się pytanie "jaka wartość wyliczeniowa jest związana z 0?" są dwie możliwe odpowiedzi.

Projektanci C# mógł odpowiedzieć na to pytanie przez:

  • rzucanie błąd
  • sekretarkę o wartości enum, który pojawia się najpierw w deklaracji
  • odpowiadając o wartości enum, który pojawia się ostatnia w deklaracja
  • odpowiadając z dowolnej wartości

projektanci językowe wag chory czasami wybiera "dowolną" trasę, ponieważ pozostawia więcej miejsca na optymalizację. Na przykład mogliby umieścić mapowanie całkowite na tablicę w tabeli mieszania lub coś takiego i pozwolić, aby odnośnik zwrócił wszystko, co najwygodniejsze. A to pozwala im zmienić później swoją strategię mapowania i zwrócić coś innego bez zerwania zachowań w stosunku do specyfikacji.

Jeśli zdefiniowano język w celu wytworzenia wartości, która była wrażliwa na kolejność deklaracji, może to trochę obciążyć implementację i zasadniczo zakończyła się jeszcze jedną regułą do śledzenia.

Właściwie oczekiwałbym, że odpowiedź brzmi "wybierz dowolną wartość", więc cieszę się, że C# wpisuje się w moje oczekiwania. Ale wszyscy jesteśmy różni i tak, niektórzy ludzie będą zaskoczeni. :)