2009-10-21 6 views
0

Когда я complile кодКак исправить ошибку литья?

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» в «Заказать»

Как это исправить?

ответ

0

Вы создали класс Order, который является IEnumerable<Order>, который позволяет вам перечислить класс, но он не создает коллекцию, которую вы можете перечислить.

Вы, вероятно, просто хотите создать colleciton элементов заказа:

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

Если вы хотите создать класс, который представляет собой набор элементов заказа вы можете просто унаследовать из списка:

public class OrderList : List<Order> {} 

Затем создается список, как это:

OrderList orders = new OrderList(); 
0

Я вижу два вопроса. Ваша собственность MyOrders имеет тип возврата IEnumerable<Order>, когда поле, которое оно возвращает, действительно имеет тип Order.

Кроме того, я не уверен, прочитал ли я это право - Order имеет базовый класс типа IEnumerable<Order> - разве это не создает какой-то бесконечный цикл? Перечислимый тип, перечислимый типа, подлежащего перечислению типа, перечислимого типа, подлежащего перечислению типа, перечисляемого типа enumarable ...

+0

Нет, вы можете технически это сделать - это просто очень, очень неправильно Ф.О. r множество причин;) –

+0

Все это означает, что у заказа есть коллекция «подзаголовков», которые могут быть или не быть пустыми - представьте, что вместо этого у вас был класс TreeNode, который реализовал IEnumerable для своих детей. Конечно, в этом контексте это, вероятно, просто ошибка, но в этом нет ничего парадоксального. – mquander

0

Что такое класс Заказать? Предполагается ли он представлять один заказ или коллекцию заказов? Если он является последним, получается из встроенного класса коллекции, который уже имеет IEnumerable в нем (например, List<>), чем переименовать его так, чтобы его имя класса сообщало, что оно представляет собой коллекцию (Orders или OrderCollection) и удаляет IEnumerable10 и 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; }  
    } 
} 

что касается неявной литья, в вашем случае, если вы не можете бросить, потому что коллекция не тот же тип, как тип объекта, который является в коллекция .

Но, в общем, вы не можете неявно лить более общий тип в более конкретный тип, потому что это может быть не более конкретный тип. Если что-то cpmes в качестве Animal, вы не можете неявно использовать его для Dog, - это может быть Cat. (С другой стороны, все в порядке. Вы можете неявно лить в Animal)
Если это была проблема, вы должны исправить это явно литье вместо.

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

значение типа 'System.Collections.Generic.IEnumerable', GetOrder имеет тип ордена. Оба они никоим образом не совместимы. Возможно, вы хотите, чтобы getOrder (неудачное именование) тоже IEnumerable?

Кроме того, это выглядит очень неправильно

Order:IEnumerable<Order> 

Я предполагаю, что это должно быть что-то вроде IEnumerable<OrderItem>

+0

Вы, скорее всего, правы. Для Order имеет смысл более точно перечислять предметы. –

1

Первая проблема заключается в том, что у вас есть заказ реализовать 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», и пусть компилятор сделает это за вас, что я сделал выше).

+0

Спасибо, Рид Копси! Thak вы очень много. Как идиот я :(:( – 2009-10-21 15:06:51

Смежные вопросы