C#中未指定类型的变量

本文关键字:变量 类型 未指定 | 更新日期: 2023-09-27 18:00:23

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

不,那行不通。但是,考虑到这三种类型都继承自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中,您可以声明一个动态类型。