嗨,我有一个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语句更改我的图表类型,所以我尝试了这种方式。
答案 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()
,PieSeries
和AreaSeries
。这也意味着编译器在编译时不会知道它具有哪些功能,因此您的安全性和执行错误更少,并且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的好处。