C#隐式类型变量重新初始化

时间:2012-02-03 15:08:37

标签: c#

如何在C#中重新初始化隐式类型变量(var)?

            var abc = new Class();
            if (a == 1)
            {
                abc = new Class1();
            }
            else if (a == 2)
            {
                abc = new Class2();
            }
            else if (a == 3)
            {
                abc = new Class3();
            }

现在我就像上面一样,我收到了错误。

无法将类型'Class1'隐式转换为'Class'

9 个答案:

答案 0 :(得分:7)

你做不到。 var不起作用。 var表示“看,我懒得输入这个变量的真正静态类型名称,你能为我解决一下吗?”这就是隐式打字的含义。

因此,在第一行,编译器决定将abc键入为Class的引用。然后,您稍后尝试将Class1的引用分配给abc。当然,除非从Class1转换为Class,否则这是不可能的。

要强调,你的代码就像你写的那样

Class abc = new Class();
if (a == 1) {
    abc = new Class1();
}
else if (a == 2) {
    abc = new Class2();
}
else if (a == 3) {
    abc = new Class3();
}

事实上,它在语义上是相同的。但现在你的错误是显而易见的。您尝试将Class1的引用分配给abcabc无法接受,除非存在从Class1Class的隐式转换。< / p>

答案 1 :(得分:7)

使用 var 进行隐式输入仍然是静态输入

var abc = new Class();

完全等同于

Class abc = new Class();

除非Class1,Class2和Class3扩展Class,否则不能将它们分配给abc。

答案 2 :(得分:3)

你不能,在那种情况下你只能在Class1 / 2/3显式继承Class时才能这样做。

答案 3 :(得分:2)

你没有。隐式初始化由编译器在赋值时确定,因此是第一行:

var abc = new Class();

相当于:

Class abc = new Class();

因此,一旦确定它是类型Class,它就不能被改变,只能显式声明。

也许您想要进行dynamic打字?

答案 4 :(得分:2)

你不能做你要求的但你可以这样做。

      object abc = new Class();
        if (a == 1)
        {
            abc = new Class1();
        }
        else if (a == 2)
        {
            abc = new Class2();
        }
        else if (a == 3)
        {
            abc = new Class3();
        }

虽然这并没有提供很多价值。如果所有类都继承自公共类或接口,那么您需要执行某些工作,这可能就是您的目标。例如,

        Animal abc  = new Animal();
        if (a == 1)
        {
            abc = new Dog();
        }
        else if (a == 2)
        {
            abc = new Cat();
        }
        else if (a == 3)
        {
            abc = new Person();
        }
        abc.sleep() 

然后睡眠会调用正确的函数,而这个函数的类型就是它的重点。

答案 5 :(得分:2)

您可以执行此操作var abc = new Class();,因为var是一种通用类型,当您执行此操作时,您正在执行Class abc = new Class();。问题是当你尝试re-initalize时。但是你错了,在你abc = new Class1();之后,你没有重新初始化abc,但是你传递了Class类型的新对象的pointer。所以编译器说你不能做这个转换,因为abc的类型是Class

但您可以使用object作为 Mark Ba​​ckett ,因为类型object是所有类的基类

此外,解决方案可能是这样的:

int a = Convert.ToInt(Console.ReadLine());

var abc = new Class();

if (a == 1)
    abc = new Class1();
else if (a == 2)
    abc = new Class2();
else if (a == 3)
    abc = new Class3();

public class Class { ... }
public class Class1:Class{ ... }
public class Class2:Class1{ ... }
public class Class3:Class2{ ... }

答案 6 :(得分:0)

你不能这样做。这只是一种等效的写作方式

Class abc = new Class(); 
if (a == 1) 
{ 
    abc = new Class1(); // fails or requires implicit conversion
} 

这显然不适用于一般情况。

答案 7 :(得分:0)

隐式类型变量仍然遵循多态 - 因此您的推断变量的类型为Class

Class abc = new Class();

由于Class1没有(可能)从Class继承,因此重新分配无效。如果要将推断变量键入限制较少的基类型(例如,对象),则可以写出声明(首选)或强制转换右侧,以便编译器推断出不同的类型:

object abc = new Class(); // Preferred
var abc = (object)new Class(); // Works

答案 8 :(得分:-1)

派对有点晚,但为什么不呢:

if (a == 1)
{
    var abc = new Class1();
}
else if (a == 2)
{
    var abc = new Class2();
}
else if (a == 3)
{
    var abc = new Class3();
}
else
{
    var abc = new Class();
}