【问题标题】:cant initialize var variable more than once不能多次初始化 var 变量
【发布时间】:2018-10-29 02:03:02
【问题描述】:

嗨,我有一个 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 语句更改图表类型,所以我尝试了这种方式。

【问题讨论】:

  • 你可以多次初始化它,但它必须是相同的类型。所以如果LineSeries,PieSeries,AreaSeries不是ColumnSeries这将不会编译。
  • @TimSchmelter 那我该怎么办?
  • 它们看起来都在抽象类 LiveCharts.Wpf.Series 下
  • 您可以创建一个系列基类,由 ColumnSeries、LineSeries、PieSeries 和 AeraSeries 扩展。根据需要将基本 var 转换为扩展类。

标签: c# var initializer livecharts


【解决方案1】:

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

要使用基类(因此可以将其他派生类分配给它),您可以强制转换已初始化的对象或不使用 var。

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

【讨论】:

    【解决方案2】:

    它们必须是同一类型。为所有这些程序编写一个通用接口,例如 ISeries。

    【讨论】:

    • 更准确的说法是它们需要是相同的类型或类型的继承家族的一部分。
    【解决方案3】:

    一开始就将它实例化为ColumnSeries,以后您将无法将其分配给不同的类型(除非它是实现ColumnSeries 的类型)。

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

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

    【讨论】:

      【解决方案4】:

      虽然我不建议这样做,但你可以使用 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 支持。

      【讨论】:

        【解决方案5】:

        虽然这不是 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 的好处。

        【讨论】:

          猜你喜欢
          • 2021-10-19
          • 1970-01-01
          • 2016-02-24
          • 2013-03-04
          • 2015-08-23
          • 2021-10-28
          • 1970-01-01
          • 1970-01-01
          • 2020-07-14
          相关资源
          最近更新 更多