C#中未指定类型的变量?
我是否可以声明一个没有类型的变量,然后根据某些条件指定类型?例如,我希望根据用户希望使用的大小创建SHA哈希对象:C#中未指定类型的变量?,c#,types,sha,C#,Types,Sha,我是否可以声明一个没有类型的变量,然后根据某些条件指定类型?例如,我希望根据用户希望使用的大小创建SHA哈希对象: //get the Sha hasher var shaHash; switch (this.HASH_ALGORITHM) { case HashAlgorithm.SHA256: //HashAlgorithm is an enum. shaHash =
//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
这可能吗?在c#4中,您可以声明一个类型。不,这不起作用。但是,考虑到这三种类型都继承自
System.Security.Cryptography.HashAlgorithm
,您可以声明该类型的变量:
HashAlgorithm shaHash;
switch(this.HASH_ALGORITHM)
{
// snip
}
编辑
只是补充一下,
var shaHash
不起作用是因为var
只是一种简写方式,表示“我不确定这里使用的最佳类型,请为我推断”。编译器要求您指定一个初始值,以便它可以确定要使用的最佳类型。必须求助于动态;您需要为此使用继承或接口。因此,类型可以是例如object
,或者如果不同的SHA
类有另一个公共超类,或者如果它们实现了某个接口,则可以使用该超类或接口。否则,您可以使用公共超类创建类,并将SHA
对象包装到适配器中。使用基本类型:
HashAlgorithm shaHash = null;
这是不可能的。为了使用var
您需要编译器知道变量的类型是什么,并且只有当您赋值时才可以使用。您也不能说var varname=null代码>因为null不定义类型。如果有一个父类在其中声明类型,还有3个其他类在父类(子类)之后继承,则可以创建一个方法,该方法将被声明为返回父类型,但在内部将返回每个子类型。
这将起作用并编译,因为父类型将自动转换为子类型。
但是,它不会反过来工作(不能将类型从子类型强制转换为父类型) 您可以,但在这种情况下不应使用动态。是的,您是对的,他应该使用它们都继承自的基类型。隐式类型的局部变量必须初始化。所以var shaHash;是一个编译错误。@code裸体,是的,我的代码将无法通过编译器。完全正确。但是,你想实现什么,而不是通过声明基类来实现呢?@kellond,在我的例子中,基类可以很好地工作。谢谢