不能多次初始化var变量

时间:2018-05-18 15:20:51

标签: c# var initializer livecharts

嗨,我有一个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 :(得分:7)

var是隐式输入;在您的情况下,它假定它应该是ColumnSeries

要使用基类(因此可以为其分配其他派生类),您可以转换初始化对象或者不使用var。

Series series = new ColumnSeries(); //Preferred. var is just a bad choice here
var series = (Series)new ColumnSeries();

答案 1 :(得分:0)

他们需要是同一类型。为所有这些程序编程到一个通用接口,类似于ISeries。

答案 2 :(得分:0)

通过将其实例化为ColumnSeries开头,您将无法在以后将其分配给其他类型(除非它是实现ColumnSeries的类型)。

相反,您可以将其声明为公共基类型(或接口),然后将其分配给实现该基类或接口的任何类型:

Series series = 
    integer == 0
        ? new LineSeries()
        : integer == 1
            ? new PieSeries()
            : integer == 2
                ? new AreaSeries()
                :  new ColumnSeries();

答案 3 :(得分:0)

虽然我建议不要这样做,但您可以使用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()PieSeriesAreaSeries。这也意味着编译器在编译时不会知道它具有哪些功能,因此您的安全性和执行错误更少,并且IDE / Auto-complete支持也更少。

答案 4 :(得分:0)

虽然这不是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();

在这种情况下,一旦你为它分配了一些内容,它就不会成为一个对象,所以不需要进行转换,但是在上面的回答中提到了Austin Bryan,你将失去其他编译器和IDE的好处。