Явный список приводит неправильный тип?

Я пытаюсь выполнить приведение к списку из результата хранимой процедуры. Я уже создал явное (рабочее) приведение для одного объекта timerangeResult -> Booking, но мне не хватает списка..

Вот код:

public static explicit operator List<Booking>(timerangeResult t)
{
List<Booking> bL = new List<Booking>();
IEnumerable<timerangeResult> tx = (IEnumerable<timerangeResult>) t;

foreach (timerangeResult tt in tx)
{
 Booking b = (Booking)tt;
        bL.Add(b);
}
//return bL;
//return new List<Booking>(bL);
//return new List<Booking>(IEnumerable < Booking > bL);
return bL;
// [NONE OF THESE WORK]
// ERROR:
// User-defined conversion must convert to or from the enclosing type (UNDERLINED: "explicit operator List<Booking>" line 1)
}

Заранее спасибо!


person dza    schedule 07.12.2010    source источник
comment
Действительно странный код, вы переводите timerangeResult в IEnumerable<timerangeResult>.   -  person Cheng Chen    schedule 07.12.2010


Ответы (3)


Оператор приведения должен быть определен в одном из двух задействованных типов. Либо в типе исходного операнда, либо в типе операнда назначения.

Другими словами, вам нужно определить оператор либо в:

  • List<Booking> (что невозможно)
  • ... or timerangeResult

Я предполагаю, что вы определили оператор в другом месте, попробуйте переместить его в тип timerangeResult.

Кроме того, обратите внимание, что явные операторы трудно обнаружить, вам действительно нужно знать, что они есть. Обычно гораздо лучше добавить метод экземпляра, который делает то же самое, т.е.:

public class timerangeResult
{
    ...

    public List<Booking> ToBookingList()
    {
        ...
    }
}
person Lasse V. Karlsen    schedule 07.12.2010
comment
Привет, Лассе, спасибо за быстрый ответ. Я определил этот код в Booking.cs. - person dza; 07.12.2010
comment
Тогда вам нужно его переместить. Вы можете добавлять операторы приведения только к Booking или из Booking внутри Booking. - person Lasse V. Karlsen; 07.12.2010

В каком типе определен оператор? Этот оператор может быть определен только в классе timerangeResult (поскольку List<Booking>, другой вариант, находится вне вашего контроля)

person Marc Gravell    schedule 07.12.2010

Вот что у меня получилось (db.designer.cs)

public partial class timerangeResult
{

    private int _ID;

    private string _Login;

    private System.DateTime _Starts;

    private System.DateTime _Ends;

    private string _Delete;

    private byte _Notify;

// CUSTOM
//public static explicit operator List<Booking>(timerangeResult t)
public static List<Booking> ToBookingList(IEnumerable<timerangeResult> t)
{
    List<Booking> bL = new List<Booking>();

    foreach (timerangeResult tt in t)
    {
        Booking b = (Booking)tt;
        bL.Add(b);
    }
    return bL;
}
// CUSTOM END^

и .. Booking.cs

public static List<Booking> Today(DateTime begin, DateTime end)
{
    try
    {
        dbDataContext db = new dbDataContext();

        IEnumerable<timerangeResult> bQ = from b in db.timerange(begin, end)
                             select b;
        List<Booking> bL = timerangeResult.ToBookingList(bQ);

        return bL;
    }
    catch (Exception)
    {
        throw;
    }
}

Теперь я получаю: "Результаты запроса не могут быть пронумерованы более одного раза".

person dza    schedule 07.12.2010