Единственный способ, который я могу решить для достижения того, чего вы хотите, - это заставить 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>
}