我可以声明一个没有类型的变量,然后根据某些条件指定类型吗?例如,我想根据用户想要使用的大小创建一个SHA Hash对象:
//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
这可能吗?
答案 0 :(得分:18)
不,那不行。但是,鉴于所有这三种类型都继承自System.Security.Cryptography.HashAlgorithm
,您可以声明该类型的变量:
HashAlgorithm shaHash;
switch(this.HASH_ALGORITHM)
{
// snip
}
修改强>
只是要补充一点,var shaHash;
不起作用的原因是因为var
只是简单的说法“我不确定这里使用的最佳类型,所以请推断它对我来说“。编译器要求您指定初始值,以便它可以确定要使用的最佳类型。
答案 1 :(得分:2)
并非诉诸dynamic
;你需要使用继承或接口。所以类型可以是例如object
,或者如果不同的SHA
类具有另一个公共超类,或者如果它们实现了某个接口,则可以使用该超类或接口。否则,您可以使用公共超类创建adapter类,并将SHA
对象包装在适配器中。
答案 2 :(得分:2)
使用基本类型:
HashAlgorithm shaHash = null;
答案 3 :(得分:1)
这是不可能的。为了使用var
,您需要编译器知道变量的类型是什么,并且只有在赋值时才能生成。你也不能说var varname = null;
因为null没有定义类型。
答案 4 :(得分:1)
如果你有一个声明类型的父类,以及在父类(子)之后继承的其他3个类,那么你可以创建一个声明为返回父类型的方法,但是你可以在里面返回每个子类型。 这将工作并编译,因为父类型将自动转换为子类型。 然而,它不会以相反的方式工作(您不能将类型从子项转换为父项)。
答案 5 :(得分:0)
在c#4中,您可以声明dynamic类型。