Проблема с приведением x <char>к x <t> - PullRequest
0 голосов
/ 27 мая 2010

Эй, ребята, я не могу справиться с этим кодом. Идея состоит в том, чтобы вернуть английский алфавит по умолчанию в случае ошибочного выполнения метода create. Спасибо.

Идея переопределить явный оператор хороша, но я не могу представить реализацию приведения.

namespace trie
    {
        class AlphabetFactory<T> where T: IConvertible
        {
            public Alphabet<char> SetDefaultAlphabet()
            {
                var list = new char[26];
                for (var i = Convert.ToInt32('a'); i <= Convert.ToInt32('z'); i++)
                    list[i] = Convert.ToChar(i);
                return new Alphabet<char>(list);
            }

            public Alphabet<T> Create(params T[] list)
            {
                if (list != null)
                    return new Alphabet<T>(list);
                else
                    return SetDefaultAlphabet();    // <- This is not correct   
            }
        }
    }

1 Ответ

0 голосов
/ 27 мая 2010

Единственный способ, который я могу решить для достижения того, чего вы хотите, - это заставить Alphabet<T> наследовать от неуниверсальной абстрактной базы или реализовать неуниверсальный интерфейс. Тогда ваш код может выглядеть примерно так:

interface IAlphabet {
    // ?
}

class Alphabet<T> : IAlphabet {
    // stuff
}

class AlphabetFactory {
    // ...

    IAlphabet Create<T>(params T[] list) where T : IConvertible {
        if (list != null)
            return new Alphabet<T>(list);
        else
            return SetDefaultAlphabet();
    }

    // ...
}

Это сделает клиентский код, использующий ваш AlphabetFactory, немного более громоздким в использовании, хотя:

int[] integers = GetIntegers(); // let's say this might be null

var alphabet = myAlphabetFactory.Create(integers);

var integerAlphabet = alphabet as Alphabet<int>;
if (integerAlphabet != null) {
    // do stuff with integerAlphabet
} else {
    // alphabet is an IAlphabet, but not an Alphabet<int>
}
...