не могу инициализировать переменную var более одного раза - PullRequest
0 голосов
/ 18 мая 2018

привет, у меня есть переменная var, и мне нужно инициализировать ее, основываясь на выражении if, это мой код:

var series = new ColumnSeries{};
if(integer == 0)
  series = new LineSeries{};
else if (integer == 1)
  series = new PieSeries{};
else if (integer == 2)
  series = new AreaSeries{};

, но получаю ошибку, что я не могу инициализировать переменную более одного раза, так как я могу инициализироватьэта переменная не раз?мне нужно изменить тип графика на основе оператора if, поэтому я попытался таким образом.

Ответы [ 5 ]

0 голосов
/ 19 мая 2018

Хотя это не лучшее использование var и object, я думаю, мы могли бы сделать что-то вроде этого:

var series = new object();

Имейте в виду, что после того, как вы назначите ему что-то, он останется объектом, и вам нужно будет привести его к нужному типу.

if(integer == 0)
    series = new LineSeries{};
else if (integer == 1)
    series = new PieSeries{};
else if (integer == 2)
    series = new AreaSeries{};

Допустим, первое условие выполнено, чтобы получить доступ к свойствам серии, которые необходимо преобразовать вLineSeries.

Вы также можете сделать:

dynamic series = new object();

В этом случае, как только вы назначите ему что-то, это будет не объект, поэтому нет необходимости в приведении, но как Остин Брайан упомянутый в его ответе выше вы теряете другие преимущества компилятора и IDE.

0 голосов
/ 18 мая 2018

Хотя я рекомендую против этого, вы можете использовать тип dynamic, который может изменять его тип при использовании, поэтому вы можете сделать:

dynamic series = new ColumnSeries{};

if(integer == 0)
   series = new LineSeries{};
else if (integer == 1)
   series = new PieSeries{};
else if (integer == 2)
   series = new AreaSeries{};

И его тип изменится на LineSeries(), PieSeries и AreaSeries соответственно.Это также означает, что компилятор не будет знать, какие функции он имеет при компиляции, поэтому вы получаете намного меньше безопасности и больше ошибок выполнения, а также меньше поддержки IDE / Auto-complete.

0 голосов
/ 18 мая 2018

var - неявная типизация;в вашем случае предполагается, что это должен быть ColumnSeries.

. Чтобы использовать базовый класс (чтобы ему могли быть назначены другие производные классы), вы могли бы привести инициализированный объект или просто не использовать var.

Series series = new ColumnSeries(); //Preferred. var is just a bad choice here
var series = (Series)new ColumnSeries();
0 голосов
/ 18 мая 2018

Создавая его как ColumnSeries для начала, вы не сможете назначить его другому типу позже (если это не тип, который реализует ColumnSeries).

Вместо этого вы можете объявить его как общий базовый тип (или интерфейс), а затем назначить его любому типу, который реализует этот базовый класс или интерфейс:

Series series = 
    integer == 0
        ? new LineSeries()
        : integer == 1
            ? new PieSeries()
            : integer == 2
                ? new AreaSeries()
                :  new ColumnSeries();
0 голосов
/ 18 мая 2018

Они должны быть одного типа.Программа для общего интерфейса для всех из них, что-то вроде ISeries.

...