如何修复铸造错误?

时间:2009-10-21 14:26:37

标签: c#

当我编译代码时

class customer
{
Order getOrder;
public IEnumerable<Order> MyOrders
{
    get { return getOrder; }
    set{getOrder=value;}
 }
}

class Order:IEnumerable<Order>
{
    string itemName;

    public string ItemName
    {
        get { return itemName; }
        set { itemName = value; }
    }
    public IEnumerator<Order> GetEnumerator()
    {
        return (IEnumerator)this.GetEnumerator();
    }
  IEnumerator IEnumerable.GetEnumerator(  )     
  {                                            
      return this.GetEnumerator ();
  }
}

我收到了 无法将类型'System.Collections.Generic.IEnumerable'隐式转换为'Order'

如何解决?

5 个答案:

答案 0 :(得分:1)

get { return getOrder; }    
set{getOrder=value;}

值的类型为'System.Collections.Generic.IEnumerable',getOrder的类型为Order。两者都不兼容。也许你想让getOrder(也不幸命名)也是IEnumerable?

此外,这看起来非常错误

Order:IEnumerable<Order>

我想它应该像IEnumerable<OrderItem>

答案 1 :(得分:1)

第一个问题是你有Order实现IEnumerable,这很奇怪。你可以做到这一点,但这很奇怪。通常情况下,你不会列举自己。

第二个问题在这里:

public IEnumerator<Order> GetEnumerator()
{
    return (IEnumerator)this.GetEnumerator();
}

您需要切换实施枚举器的方式。 IEnumerator<T>继承了IEnumerator,但你却反过来对待它。切换声明:

public IEnumerator<Order> GetEnumerator()
{
    yield return this; // You need to create an ACTUAL enumerator here!
}
IEnumerator IEnumerable.GetEnumerator()
{
    return this.GetEnumerator(); // This can call the above, since IEnumerator<Order> is also IEnumerator
}

但是,在您发布的代码中,您实际上从未实际使用GetEnumerator来返回枚举器。这有很多选项,但你需要实际创建一个枚举器(或者使用“yield return”并让编译器为你完成它,我在上面做过)。

答案 2 :(得分:0)

我看到两个问题。当您返回的字段实际上属于MyOrders时,您的属性IEnumerable<Order>的返回类型为Order

另外,我不确定我是否正确阅读 - Order有一个类型IEnumerable<Order>的基类 - 这不会创建某种无限循环吗?一个类型可枚举类型的枚举类型的枚举类型可枚举类型可枚举类型可枚举...

答案 3 :(得分:0)

什么是课程订单?它应该代表单个订单还是订单集合?如果是后者,则从已经具有IEnumerable的内置集合类派生(如List<>),而不是重命名它,以便它的classname传达它是一个集合(Orders或{{ 1}})并删除OrderCollectionIEnumerable实现(它们是从IEnumerator派生而来的......

List<>

关于隐式强制转换,在您的情况下,您无法强制转换,因为集合与 集合中的对象类型的类型不同。

但是,通常,您不能隐式将更通用的类型转换为更具体的类型,因为它可能不是更具体的类型。如果某个内容以// inheriting from List<Order> means you get Enumerable for free class Orders: List<Order> { string itemName; public string ItemName { get { return itemName; } set { itemName = value; } } } 形式出现,则无法隐式将其投放到Animal, - 它可能是Dog。 (反过来说没问题你可以隐含地将Cat强制转换为Dog) 如果这是问题所在,您可以通过显式转换来修复它。

答案 4 :(得分:0)

您创建了一个OrderIEnumerable<Order>,可以枚举该类,但它不会创建您可以枚举的集合。

您可能只想创建订单商品的收藏品:

List<Order> orders = new List<Order>();

如果您想创建一个订单项集合的类,您可以直接从列表继承:

public class OrderList : List<Order> {}

然后你创建如下列表:

OrderList orders = new OrderList();