C# 将x强制转换为x时出现问题

C# 将x强制转换为x时出现问题,c#,generics,variable-assignment,C#,Generics,Variable Assignment,嘿,伙计们,我不能用这个代码。其思想是在create方法执行错误的情况下返回默认的英文字母表。谢谢 重写显式运算符的想法很好,但我无法想象强制转换的实现 namespace trie { class AlphabetFactory<T> where T: IConvertible { public Alphabet<char> SetDefaultAlphabet() {

嘿,伙计们,我不能用这个代码。其思想是在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   
            }
        }
    }

我认为实现您想要的功能的唯一方法是使字母表从非泛型抽象基继承,或者实现非泛型接口。那么您的代码可能如下所示:

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.Createnull呢?我想你的设计在这里出了差错。我不明白你想实现什么。看来你对自己的问题考虑得不够仔细。例如:如果使用T==int和list==null调用Create方法,那么您希望返回什么?在这种情况下不能返回字母,因为t==int,可以吗?然后呢?@Lasse:有趣的是,有人投票支持了我的问题,尽管你的问题是在两分钟前提出的,而且基本上是一样的-这只是设计上的不足。我已经改变了。顺便说一下,谢谢你的评论。
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>
}