2011-06-24 9 views
4

変数を宣言し、型を指定せずに、いくつかの条件に基づいて型を指定することはできますか?たとえば、ユーザーが使用したいサイズに基づいてSHA Hashオブジェクトを作成したいとします。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

いいえ、それは動作しません。しかし、これらのタイプの3つのすべてが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;と言うこともできません。

1

タイプを宣言する親クラスと、親クラス(子)の後に継承する他の3つのクラスがある場合、親タイプを返すものとして宣言されるメソッドを作成することができますそれぞれの子タイプを返します。 親タイプが自動的に子タイプにキャストされるので、これは機能し、コンパイルされます。 しかし、他の方法では機能しません(子から親に型をキャストできません)。