C#中未指定类型的变量?

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 =

我是否可以声明一个没有类型的变量,然后根据某些条件指定类型?例如,我希望根据用户希望使用的大小创建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

这可能吗?

在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,在我的例子中,基类可以很好地工作。谢谢