我想用这样的东西:
if(x==5)
{
var mydb= ........ ;
}
else
{
var mydb = ........ ;
}
但它没有用,因为我无法在if语句中声明变量。
所以我试着这样做:
var mydb;
if (x==5)
{
mydb= ............. ;
}
else
{
mydb=.............;
}
但是id也没有用,因为我必须初始化变量(mydb)。
所以问题是:我不一定知道变量的类型,我是否可以声明它然后更改if语句中的类型?
答案 0 :(得分:11)
C#是一种静态类型的语言(不考虑C#4;它引入了你真正需要它的动态类型,但是值得理解“正常”C#的做事方式)。编译器需要知道变量的类型,以便if可以计算每个引用的含义。例如,如果您使用
string x = "text";
int y = x.Length;
编译器需要知道x
的类型为string
,以便它可以检查该类型是否具有Length
属性并在IL中发出对它的调用。
答案 1 :(得分:6)
你可以使用:
object mydb = null;
if(x==5)
{
mydb= ........ ;
}
else
{
mydb = ........ ;
}
但是当您想要访问对象的字段,属性和方法时,您必须将对象取消装箱或强制转换回其正确的类型。除非你等待C#4,它可以促进动态方法(确切的术语:动态调度?)调用
答案 2 :(得分:4)
除非你使用dynamic
specifier运行4.0,否则C#是静态类型的,所以除了通过多态之外,通常不可能改变类型。
答案 3 :(得分:1)
您可以声明基类型并从中继承这两种类型。但主要问题是: 如果你不知道它的类型,你将如何使用它?
答案 4 :(得分:1)
我假设您有两个不兼容的类型来自两个代表数据库的不同库。您可以编写一个带有公共操作的接口,并编写适配器来封装来自库的类并实现接口。比变量mydb
的类型可以是该接口。
当然你可以使用object
作为mydb
的类型并使用动态类型测试和强制转换,但在这种情况下,这将是一个非常糟糕的设计决策。
答案 5 :(得分:0)
您可以使用 SYSTEM.CONVERT CLASS 这样或使用动态
string possibleInt = "1234";
int count = Convert.ToInt32(possibleInt);
或使用明确的转化次数
在C#中,您可以使用强制转换运算符执行显式转换。强制转换在圆括号中指定要转换的类型。以下代码示例中显示了执行显式转换的语法。
DataType variableName1 = (castDataType) variableName2;
答案 6 :(得分:0)
你可以这样使用 bool结果=(条件)? true:false;
var myDB = (x==5) ? true : false ;
or
var myDB = x==5 ? "doing something when case is true" : "doing something when case is false" ;