2011-06-24 68 views
4

是否可以声明一个变量,没有类型,然后根据一些条件指定类型?例如,我想根据用户希望使用的尺寸创建SHA哈希对象:C#中未指定类型的变量?

 //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 

这可能吗?

+2

你试过了吗? – CodeNaked

+0

隐式类型的局部变量必须被初始化。所以var shaHash;是一个编译错误。 – Joe

+0

@CodeNaked,是的,我的代码不会通过编译器。准确地说是 –

回答

18

不,那不行。但是,考虑到所有这三个类型的从System.Security.Cryptography.HashAlgorithm继承,你可以声明该类型的变量:

HashAlgorithm shaHash; 

switch(this.HASH_ALGORITHM) 
{ 
    // snip 
} 

编辑

我想补充,即var shaHash;将无法​​正常工作的原因是因为var只是一个简短的说法,“我不确定在这里使用的最佳类型,所以请为我推断它”。编译器要求您指定一个初始值,以便它可以确定要使用的最佳类型。

0

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

+4

你可以,但在这种情况下你不应该使用'dynamic'。 –

+0

是的,你是对的,他应该使用它们都继承的基本类型。 –

2

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

2

使用基本类型:

HashAlgorithm shaHash = null; 
1

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

1

如果你有一个声明类型的父类和3个在父类(子类)之后继承的其他类,那么你可以创建一个声明为返回父类型但在你内部的方法会返回每个子类型。 这将工作并编译,因为父类型将自动转换为子类型。 然而,它不会以其他方式工作(您不能将子类型转换为父类型)。