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

いいえ、それは機能しません。ただし、これら3つのタイプすべてがから継承するSystem.Security.Cryptography.HashAlgorithmことを考えると、そのタイプの変数を宣言できます。

HashAlgorithm shaHash;

switch(this.HASH_ALGORITHM)
{
    // snip
}

編集

付け加えると、var shaHash;うまくいかない理由はvar、「ここで使用するのに最適なタイプがわからないので、推測してください」という簡単な言い方だからです。コンパイラーは、使用するのに最適なタイプを判別できるように、初期値を指定する必要があります。

于 2011-06-24T14:09:16.720 に答える
2

に頼ることなくしてはいけませんdynamic; これには、継承またはインターフェースを使用する必要があります。したがって、タイプは、たとえばobject、異なるSHAクラスに別の共通のスーパークラスがある場合、またはそれらが何らかのインターフェイスを実装している場合は、そのスーパークラスまたはインターフェイスを使用できます。それ以外の場合は、共通のスーパークラスを使用してアダプタークラスを作成し、SHAオブジェクトをアダプターでラップすることができます。

于 2011-06-24T14:10:14.543 に答える
2

基本タイプを使用:

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

それは不可能です。使用varするには、コンパイラが変数の型を知る必要があります。これは、値を割り当てるときにのみ可能です。var varname = null;また、nullは型を定義しないため、言うことはできません。

于 2011-06-24T14:11:15.333 に答える
1

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

于 2012-04-12T11:46:21.547 に答える
0

C#4では、動的型を宣言できます。

于 2011-06-24T14:08:33.910 に答える