Переменная неопределенного типа в C #? - PullRequest
4 голосов
/ 24 июня 2011

Можно ли мне объявить переменную без типа, а затем указать тип на основе некоторых условий? Например, я хочу создать объект SHA Hash на основе размера, который пользователь хотел бы использовать:

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

Возможно ли это?

Ответы [ 6 ]

18 голосов
/ 24 июня 2011

Нет, это не сработает. Но, учитывая, что все три из этих типов наследуются от System.Security.Cryptography.HashAlgorithm, вы можете объявить переменную этого типа:

HashAlgorithm shaHash;

switch(this.HASH_ALGORITHM)
{
    // snip
}

Редактировать

Просто добавлю, причина, по которой var shaHash; не будет работать, заключается в том, что var - это просто краткий способ сказать: "Я не уверен, какой тип шрифта лучше использовать здесь, поэтому, пожалуйста, сделайте это для меня" , Компилятор требует, чтобы вы указали начальное значение, чтобы он мог определить лучший тип для использования.

2 голосов
/ 24 июня 2011

Используйте базовый тип:

HashAlgorithm shaHash = null;
2 голосов
/ 24 июня 2011

Не без обращения к dynamic; для этого вам нужно использовать наследование или интерфейсы. Таким образом, тип может быть, например, object, или если разные классы SHA имеют другой общий суперкласс или если они реализуют некоторый интерфейс, вы можете использовать этот суперкласс или интерфейс. В противном случае вы можете создать классы адаптер с общим суперклассом и обернуть объекты SHA в адаптеры.

1 голос
/ 12 апреля 2012

Если у вас есть родительский класс, в котором вы объявляете тип, и 3 других класса, которые наследуются после родительского класса (потомков), то вы можете создать метод, который будет объявлен как возвращающий родительский тип, но внутри вы могли бывернуть каждый из дочерних типов.Это будет работать и компилироваться, поскольку родительский тип будет автоматически преобразован в дочерний тип.Однако он не будет работать наоборот (вы не можете привести тип от дочернего к родительскому).

1 голос
/ 24 июня 2011

Это не возможно.Чтобы использовать var, вам нужно, чтобы компилятор знал, каким будет тип вашей переменной, и это возможно только при назначении значения.Также вы не можете сказать var varname = null;, потому что нуль не определяет тип.

0 голосов
/ 24 июня 2011

В c # 4 вы можете объявить динамический тип.

...