Явный список приведен неверного типа? - PullRequest
2 голосов
/ 07 декабря 2010

Я пытаюсь привести к списку из результата хранимой процедуры. Я уже создал явное (рабочее) приведение для одного объекта 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)
}

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

Ответы [ 3 ]

3 голосов
/ 07 декабря 2010

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

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

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

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

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

public class timerangeResult
{
    ...

    public List<Booking> ToBookingList()
    {
        ...
    }
}
0 голосов
/ 07 декабря 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;
    }
}

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

0 голосов
/ 07 декабря 2010

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

...