如何在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'
答案 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
的引用分配给abc
但abc
无法接受,除非存在从Class1
到Class
的隐式转换。< / 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 Backett ,因为类型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();
}