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

时间:2011-06-24 14:06:56

标签: c# types sha

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

这可能吗?

6 个答案:

答案 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类型。