4

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

这可能吗?

4

6 回答 6

18

不,那行不通。但是,鉴于所有这三种类型都继承自System.Security.Cryptography.HashAlgorithm,您可以声明该类型的变量:

HashAlgorithm shaHash;

switch(this.HASH_ALGORITHM)
{
    // snip
}

编辑

只是补充一下,var shaHash;不起作用的原因是因为这var只是一种简写方式,即“我不确定在这里使用的最佳类型,所以请为我推断”。编译器要求您指定一个初始值,以便它可以确定要使用的最佳类型。

于 2011-06-24T14:09:16.720 回答
2

并非没有诉诸于dynamic; 您需要为此使用继承或接口。所以类型可以是 eg object,或者如果不同的SHA类有另一个共同的超类,或者如果它们实现了某个接口,你可以使用那个超类或接口。否则,您可以创建具有公共超类的适配器SHA类并将对象包装在适配器中。

于 2011-06-24T14:10:14.543 回答
2

使用基本类型:

HashAlgorithm shaHash = null;
于 2011-06-24T14:10:14.567 回答
1

如果您有一个声明类型的父类,以及在父类(子类)之后继承的其他 3 个类,那么您可以创建一个方法,该方法将被声明为返回父类型,但在内部您将返回每个子类型。这将起作用并编译,因为父类型将自动转换为子类型。但是,它不会反过来工作(您不能将类型从子项转换为父项)。

于 2012-04-12T11:46:21.547 回答
1

这是不可能的。为了使用var,您需要编译器知道变量的类型是什么,并且只有在您分配值时才可能。您也不能说var varname = null;,因为 null 没有定义类型。

于 2011-06-24T14:11:15.333 回答
0

在 c# 4 中,您可以声明动态类型。

于 2011-06-24T14:08:33.910 回答