我是否可以声明一个没有类型的变量,然后根据一些条件指定类型?例如,我想根据用户想要使用的大小创建一个SHA哈希对象:
//get the Sha hasher
var shaHash;
switch (this.HASH_ALGORITHM)
{
case HashAlgorithm.SHA256: //HashAlgorithm is an enum.
shaHash = SHA256.Create();
break;
case HashAlgorithm.SHA384:
shaHash = SHA384.Create();
break;
case HashAlgorithm.SHA512:
shaHash = SHA512.Create();
break;
}
//... do hashing
这可能吗?
不,那行不通。但是,考虑到这三种类型都继承自System.Security.Cryptography.HashAlgorithm
,您可以声明该类型的变量:
HashAlgorithm shaHash;
switch(this.HASH_ALGORITHM)
{
// snip
}
编辑
补充一下,var shaHash;
不起作用的原因是var
只是一种简写方式,表示"我不确定在这里使用的最佳类型,所以请为我推断"。编译器要求您指定一个初始值,以便确定要使用的最佳类型。
不使用dynamic
;为此,您需要使用继承或接口。因此,类型可以是例如object
,或者如果不同的SHA
类有另一个公共超类,或者如果它们实现了某个接口,则可以使用该超类或接口。否则,您可以创建具有公共超类的适配器类,并将SHA
对象封装在适配器中。
使用基本类型:
HashAlgorithm shaHash = null;
如果有一个父类在其中声明类型,还有3个其他类在父类(子类)之后继承,那么您可以创建一个方法,该方法将被声明为返回父类型,但在内部您将返回每个子类型。这将起作用并进行编译,因为父类型将自动转换为子类型。但是,它不会反过来工作(不能将类型从子类型强制转换为父类型)。
这是不可能的。为了使用var
,你需要编译器知道变量的类型是什么,只有当你赋值时才可能。另外,不能说var varname = null;
,因为null并不能定义类型。
在c#4中,您可以声明一个动态类型。