Перечисления только называют целыми числами, типами или ни одним из обоих?

Простой способ сделать это - сохранить логическое значение, когда щелчок вызывается с помощью executeClick. Пример

button2.setOnClickListener {
    //The click here is performed by clicking on the button itself
    buttonFunctionality();
}

button1.setOnClickListener {
    //Button 2 click performed via Button 1
    performedProgrammatically = true;
    buttonFunctionality();
}
9
задан Aleksandar 9 December 2008 в 09:03
поделиться

3 ответа

Перечислимые типы отличны, но Вы смущаетесь неявным броском, который находится в foreach.

Давайте перепишем Ваш цикл немного:

public static void Main()
{
    List<Cars> cars = new List<Cars>();
    List<Animals> animals = new List<Animals>();
    cars.Add(Cars.Chevrolet);
    cars.Add(Cars.Honda);
    cars.Add(Cars.Toyota);

    foreach (Cars value in cars)
    {
        // This time the cast is explicit.
        Animals isItACar = (Animals) value;
        Console.WriteLine(isItACar.ToString());
    }
    Console.ReadLine();
}

Теперь результат удивляет Вас? Надо надеяться, не, кроме возможно того, что можно бросить от одного перечисления до другого. Это - просто более явная версия того, что делает Ваш исходный код.

То, что существует бросок, неявный в каждом foreach цикл (даже при том, что это обычно не) является битом, который большинство разработчиков нашло бы сбивающим с толку, я думаю.

От раздела 8.8.4 из спецификации C# 3.0:

Вышеупомянутые шаги, в случае успеха, однозначно производят тип C набора, тип E перечислителя и тип T элемента. foreach оператор формы

foreach (V v in x)  embedded-statement 

затем расширен до:

{
    E e = ((C)(x)).GetEnumerator();
    try {
        V v;
        while (e.MoveNext()) {
            v = (V)(T)e.Current;
            embedded-statement
        }
    }
    finally {
        ... // Dispose e
    }
}

Само преобразование перечисления покрыто разделом 6.2.2:

Явные преобразования перечисления:

  • От sbyte, байта, короткого, ushort, интервал, uint, долго, ulong, символ, плавание или десятичное число к любому перечислимому типу.
  • От любого перечислимого типа до sbyte, байта, короткого, ushort, интервал, uint, долго, ulong, символ, плавание или десятичное число.
  • От любого перечислимого типа до любого другого перечислимого типа.

Явное преобразование перечисления между двумя типами обрабатывается путем обработки любого участвующего перечислимого типа как базового типа того перечислимого типа и затем выполнения неявного или явного числового преобразования между получающимися типами. Например, учитывая перечислимый тип E с и базовый тип интервала, преобразование от E до байта обрабатывается как явное числовое преобразование (§6.2.1) от интервала до байта, и преобразование от байта до E обрабатывается как неявное числовое преобразование (§6.1.2) от байта до интервала.

21
ответ дан 4 December 2019 в 09:14
поделиться

Концептуально, Перечисление является значением со статическим контролем типов со строковым представлением и числом. Когда Вы звоните ToString() на перечислении это возвратит строковое представление. Когда Вы звоните GetType() на перечислении Вы получите статический перечисляемый тип. Если Вы бросаете перечисление к int, Вы получите целочисленное значение для перечисления.

Перечисления, как предполагается, со строгим контролем типов, но существуют некоторые вещи, о которых необходимо знать, как то, что любое целое число может быть брошено к любому перечислению, даже если оно не будет иметь соответствующего объявления (в этом случае, то строковое представление совпадет с числом).

В CLR, перечисления (как bools) просто рассматриваются как ints, но если Вы назвали GetType () или GetString () он называет версии, которые делают то, что было описано выше.

2
ответ дан 4 December 2019 в 09:14
поделиться

Можно также получить перечисление из определенного типа.

public enum Cats : byte { ... }
public enum Dogs : int { ... }
0
ответ дан 4 December 2019 в 09:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: