использование 'является' ключевым словом в переключателе в c#

Это ошибка в Firefox, Edge и IE11.

С flex-direction: column-reverse полоса прокрутки появляется только в Chrome.

Если вы переключитесь на column, полоса прокрутки Работает во всех браузерах.

Дополнительная информация:

17
задан Matt J 17 March 2009 в 07:20
поделиться

9 ответов

Это действительно похоже на ситуацию для хорошей полиморфной реализации. При переопределении соответствующих методов в производных классах Вам, возможно, не понадобятся регистрации цикла вообще.

13
ответ дан 30 November 2019 в 11:38
поделиться

В C# я полагаю, что оператор переключения только работает с целыми числами и строками.

0
ответ дан 30 November 2019 в 11:38
поделиться

В то время как не возможно использовать оператор переключения для проверки типов, не невозможно уменьшить проблему до более управляемой кодовой базы.

В зависимости от определенной ситуации и требования я рассмотрел бы.

  • Используя IDictionary<Type, T> для хранения результата в словаре. T мог самостоятельно быть делегатом, к которому можно обратиться. Это будет работать, если Вы не должны будете волноваться о наследовании - то питание для наследования возьмет немного больше работы.

  • Используя имя типа класса (который является строкой) в операторе переключения. Это использует switch (b.GetType().Name) и нет никакой опции для глубокой структуры наследования.

2
ответ дан 30 November 2019 в 11:38
поделиться

Едва ли переключатели соответствуют переменной (строка или интервал (или перечисление)) с константным выражением как оператор переключения.

http://msdn.microsoft.com/en-us/library/06tc147t (По сравнению с 71) .aspx

1
ответ дан 30 November 2019 в 11:38
поделиться

Вы могли добавить метод getType() к BaseType, который реализован каждым конкретным подклассом, чтобы возвратить уникальный интегральный идентификатор (возможно перечисление) и включить это, да?

1
ответ дан 30 November 2019 в 11:38
поделиться

В C# не возможно использовать "," ключевое слово как часть оператора переключения. Все маркировки случая в переключателе должны оценить к константным выражениям. не конвертируемо к константному выражению.

я определенно чувствую боль хотя когда дело доходит до включения типов. Поскольку действительно решение, Вы обрисовали в общих чертах работы, но это - conveluted способ сказать для x, делает y и b. Это было бы намного больше natular, чтобы записать, что это больше как следующий


TypeSwitch.Do(
    sender,
    TypeSwitch.Case<Button>(() => textBox1.Text = "Hit a Button"),
    TypeSwitch.Case<CheckBox>(x => textBox1.Text = "Checkbox is " + x.Checked),
    TypeSwitch.Default(() => textBox1.Text = "Not sure what is hovered over"));

Вот является сообщением в блоге, которое я записал о том, как достигнуть этой функциональности.

http://blogs.msdn.com/jaredpar/archive/2008/05/16/switching-on-types.aspx

4
ответ дан 30 November 2019 в 11:38
поделиться

Существует другая вещь думать о помимо способа, которым компилятор обрабатывает switch операторы, и это - функционирование is оператор. Существует большая разница между:

if (obj is Foo)

и

if (obj.GetType() == typeof(Foo))

Несмотря на имя, is оператор говорит Вам, если объект совместим с данным типом, не, если это из данного типа. Это приводит к не полностью очевидным ошибкам (хотя это довольно очевидное), которые похожи:

if (obj is System.Object)
{
   //this will always execute
}
else if (obj is Foo)
{
   //this will never execute
}

Многие предложения здесь указывают на Вас в направлении использования типа объекта. Это прекрасно, если то, что Вы действительно хотите, является логикой, связанной с каждым типом. Но если это так, идите тщательно при использовании is оператор.

Также: хотя Вы не можете изменить эти базовые типы, который не означает, что Вы не можете использовать предложение Owen. Вы могли реализовать дополнительные методы:

public enum MyType { Foo, Bar, Baz };
public static class MyTypeExtension
{
   public static MyType GetMyType(this Foo o)
   {
      return MyType.Foo;
   }
   public static MyType GetMyType(this Bar o)
   {
      return MyType.Bar;
   }
   public static MyType GetMyType(this Baz o)
   {
      return MyType.Baz;
   }
}

Затем Вы можете использовать switch оператор:

switch (myObject.GetType())
{
   case MyType.Foo:
     // etc.
-1
ответ дан 30 November 2019 в 11:38
поделиться

Случаи типа и объектно-ориентированный код, кажется, не входят в это хорошо вместе, по моему опыту. Подход, который я предпочитаю в этой ситуации, двойной шаблон отправки . Короче говоря:

  • Создают тип слушателя с пустым виртуальным Процессом метода (аргумент ExtendedTypeN) для каждого расширенного типа, который Вы будете диспетчеризировать.
  • Добавляют виртуальный метод Отправка (Слушатель слушателя) к базовому типу, который берет слушателя в качестве аргумента. Его реализация должна будет позвонить слушателю. Процесс ((Основа) это).
  • более чем поездка метод Отправки в каждом расширенном типе для вызова соответствующего более чем загрузка из Процесса в типе слушателя.
  • Расширяют тип слушателя путем переопределения соответствующего метода Процесса для каждого подтипа, которым Вы интересуетесь.

танец перестановки аргумента устраняет сужение, брошенное путем сворачивания его в вызов для Диспетчеризации - получатель знает свой точный тип и передает его путем призывания обратно точной перегрузки Процесса для его типа. Это - также большая победа производительности в реализациях, таких как.NET Компактная Платформа, в которой сужающиеся броски являются чрезвычайно медленными, но виртуальная отправка быстра.

результат будет чем-то вроде этого:


public class Listener
{
    public virtual void Process(Base obj) { }
    public virtual void Process(Derived obj) { }
    public virtual void Process(OtherDerived obj) { }
}

public class Base
{
    public virtual void Dispatch(Listener l) { l.Process(this); }
}

public class Derived
{
    public override void Dispatch(Listener l) { l.Process(this); }
}

public class OtherDerived
{
    public override void Dispatch(Listener l) { l.Process(this); }
}

public class ExampleListener
{
    public override void Process(Derived obj)
    {
        Console.WriteLine("I got a Derived");
    }

    public override void Process(OtherDerived obj)
    {
        Console.WriteLine("I got an OtherDerived");
    }

    public void ProcessCollection(IEnumerable collection)
    {
        foreach (Base obj in collection) obj.Dispatch(this);
    }
}
0
ответ дан 30 November 2019 в 11:38
поделиться
Другие вопросы по тегам:

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