C# 使用LINQ时发生无效的强制转换异常

C# 使用LINQ时发生无效的强制转换异常,c#,linq,exception,C#,Linq,Exception,我是一个典型的新手 我可以编译我的程序,但在运行程序时会得到一个invalidcast例外 我的代码有什么问题。我不知道该找什么: 这是我的代码.NET3.5 class Element{ private int i; public int I { get { return i; } set { i = value; } } private string s; public string S { get { return s; } set { s = value;

我是一个典型的新手

我可以编译我的程序,但在运行程序时会得到一个invalidcast例外

我的代码有什么问题。我不知道该找什么:

这是我的代码.NET3.5

class Element{
    private int i;
    public int I { get { return i; } set { i = value; } }
    private string s;
    public string S { get { return s; } set { s = value; } }

    public Element(string _s, int _i) {
        this.s = _s;
        this.i = _i;
    }
}
class myDict : Dictionary<string, Element> {
    public void afunction() { 

    }
}

class Program {
    static void Main(string[] args) {

        myDict myDict = new myDict();
        myDict.Add("a", new Element("x", 23));
        myDict.Add("b", new Element("y", 48));

       var sortedDict = ((from entry in myDict orderby entry.Key descending select entry).Take(10));

       myDict = (myDict)sortedDict.ToDictionary(v => v.Key, v => v.Value);
        foreach (KeyValuePair<string, Element> kvp in myDict) {
            System.Console.WriteLine("-> " +kvp.Key + " " + kvp.Value);
        }
        Console.ReadLine();
    }
}

谢谢!迈克尔:

我认为问题在于你将sortedDict.ToDictionary的结果作为myDict进行了铸造

myDict = (myDict)sortedDict.ToDictionary(v => v.Key, v => v.Value);
不返回myDict类,而是返回Dictionary类。您不能从Dictionary强制转换到myDict,尽管因为myDict源于Dictionary,所以您可以用另一种方式强制转换

您不能这样做:

myDict = (myDict)sortedDict.ToDictionary(v => v.Key, v => v.Value);
调用时,创建的是字典,而不是myDict实例。该强制转换无效

然而,在这种情况下,没有理由这样做。您可以直接使用sortedDict结果

如果您想这样做,我建议向myDict添加一个构造函数,该构造函数接受IEnumerable。然后你可以做:

class myDict : Dictionary<string, Element> {
     public myDict() {}
     public myDict(IEnumerable<KeyValuePair<string, Element>> pairs)
     {
          foreach(var pair in pairs)
               this.Add(pair.Key, pair.Value); // Add in all elements
     }
}

也就是说,直接将字典子类化是个坏主意。如果您想创建自定义词典,应该将框架词典封装在您自己的类中,并实现它。

您的问题是无法回溯到myDict,因为它是一个比dictionary更具体的类。

ToDictionary调用返回一个词典。仅仅因为myDict是一本字典并不意味着字典就是myDict

你好

你好

我是个典型的新手

欢迎登机

我可以编译我的程序,但在运行程序时会出现无效的强制转换异常

cast操作符通常意味着我告诉编译器这个转换是有效的。如果我出错,在运行时抛出一个无效的强制转换异常

我的代码有什么问题。我不知道该找什么

那么,与其给你一条鱼——字典上的字模是无效的——不如让我们教你如何钓到自己的鱼

在调试模式下编译程序并在调试器中运行。调试器应在异常的确切位置中断。然后,您可以分析该确切站点的错误

如果由于某种原因无法在调试器中运行代码,请在调试模式下编译程序并正常运行。当您得到异常时,请查看异常的堆栈跟踪部分。它应该有异常站点的行号,以便您可以检查该代码

如果由于某种原因您无法做到这一点,请使用异常消息来尝试解决它。无效的强制转换异常意味着不良行为是强制转换运算符的结果。程序中有两个地方使用了强制转换操作符。字典上的cast中有显式用法,foreach循环中有隐式用法

许多人对后者感到惊讶。当你说

foreach(Giraffe giraffe in animals)
这实际上意味着将动物列表中的每一种动物都投给长颈鹿,如果其中一种动物是老虎、小袋鼠或其他动物,则给予无效的投法例外。这并不意味着忽略所有不是长颈鹿的动物——如果你想要,那么就说

foreach(Giraffe giraffe in animals.OfType<Giraffe>())

问题几乎肯定会出现在这两个地方之一

不要继承像List和Dictionary这样的BCL集合类。+1:我是刚刚在动物中学会foreachGiraffe的人
foreach(Giraffe giraffe in animals.OfType<Giraffe>())