Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中更改变量类型?_C#_Variables_Types - Fatal编程技术网

如何在C#中更改变量类型?

如何在C#中更改变量类型?,c#,variables,types,C#,Variables,Types,我想用这样的东西: if(x==5) { var mydb= ........ ; } else { var mydb = ........ ; } 但它不起作用,因为我不能在if语句中声明变量 所以我试着这样做: var mydb; if (x==5) { mydb= ............. ; } else { mydb=.............; } 但是id也不起作用,因为我必须初始化变量(mydb) 所以问题是:我不一定知道变量的类型,我

我想用这样的东西:

if(x==5)
{
    var mydb= ........ ;
}
else 
{
    var mydb = ........ ;
}
但它不起作用,因为我不能在if语句中声明变量

所以我试着这样做:

var mydb;

if (x==5)
{
    mydb= ............. ;
}
else 
{
    mydb=.............;
}
但是id也不起作用,因为我必须初始化变量(mydb)


所以问题是:我不一定知道变量的类型,我可以声明它,然后在if语句中更改类型吗?

不,你不能。变量永远不会改变它们的类型。你真正感兴趣的类型是什么?您能将变量声明为某个公共基类型或它们都实现的接口吗?如果你能告诉我们更多关于你的情况,我们也许能帮助你更多

C#是一种静态类型语言(撇开C#4不谈,它在您真正需要的地方引入了动态类型,但首先需要了解“正常”的C#方式)。编译器需要知道变量的类型,以便if能够计算出对它的每个引用的含义。例如,如果您使用

string x = "text";
int y = x.Length;

编译器需要知道
x
的类型为
string
,以便它可以检查该类型是否具有
Length
属性,并在IL中发出对该属性的调用。

C#是静态类型的,除非您使用,因此,除非通过多态性,否则更改类型通常是不可能的。

您可以声明基类型并从中继承这两种类型。但主要问题是: 如果您不知道它的类型,您将如何使用它?

您可以使用:

object mydb = null;

if(x==5)
{
    mydb= ........ ;
}
else 
{
    mydb = ........ ;
}

但是,当您想要访问对象的字段、属性和方法时,必须将对象取消装箱或强制转换回其正确的类型。除非您等待能够促进动态方法(确切术语:dynamic dispatch?)调用的C#4,否则我假定您有两个不兼容的类型,它们来自两个不同的库,都表示一个数据库。您可以编写一个带有通用操作的接口,并编写适配器来封装来自库的类,并实现您的接口。而变量的类型
mydb
可能就是该接口


当然,您可以使用
object
作为
mydb
的类型,并使用动态类型测试和强制转换,但在这种情况下,这将是一个非常糟糕的设计决策。

您可以像这样使用SYSTEM.CONVERT CLASS或使用动态

string possibleInt = "1234"; 
int count = Convert.ToInt32(possibleInt);
或者使用显式转换

在C#中,可以使用cast操作符执行显式转换。强制转换在圆括号中指定要转换为的类型。下面的代码示例中显示了执行显式转换的语法

DataType variableName1 = (castDataType) variableName2;
你可以这样用 布尔结果=(条件)?真:假

var myDB = (x==5) ? true : false ;
or
var myDB = x==5 ? "doing something when case is true" : "doing something when case is false" ;

除非您处理的是值类型,否则不会创建任何框,因此术语“unbox”是不合适的。如果将值类型用作对象,则会将其放入一个框中,以便将其放入堆中(通常值对象只能存在于堆栈中)。@drorhan:是的,但这几乎肯定不是正确的解决方案-我鼓励C#初学者在熟悉“正常”(静态)之前,尽量避免使用动态类型C#。也许对象类型可以帮上忙@德罗汉:这种情况很少发生;通常会有一些具有所需功能的公共基类型或接口。如果这两种类型真的没有共同点,我会质疑是否应该在这两种情况下都使用相同的变量。如果这两种类型真的没有共同点,我建议使用有区别的联合类型,如Haskell的非此即彼()或F#的选择序列()类型
或者
使事物比
对象
明确得多。作为动态类型的变量仍然有一个静态类型:动态类型。无法更改变量的类型。