【问题标题】:Explicit List cast wrong type?显式列表转换错误类型?
【发布时间】:2010-12-07 11:43:24
【问题描述】:

我正在尝试从存储过程的结果转换为 List .. 我已经为 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)
}

提前致谢!

【问题讨论】:

  • 真的很奇怪的代码,你把timerangeResult转换成IEnumerable&lt;timerangeResult&gt;

标签: c# casting explicit


【解决方案1】:

需要在所涉及的两种类型之一中定义强制转换运算符。可以是源操作数类型,也可以是目标操作数类型。

换句话说,您需要在以下位置定义运算符:

  • List&lt;Booking&gt;(这是不可能的)
  • ...或timerangeResult

我的猜测是您在其他地方定义了运算符,请尝试将其移动到 timerangeResult 类型。

另外,请注意,显式运算符很难发现,您确实需要知道它们的存在。通常最好添加一个执行相同操作的实例方法,即:

public class timerangeResult
{
    ...

    public List<Booking> ToBookingList()
    {
        ...
    }
}

【讨论】:

  • 您好 Lasse,感谢您的快速回复。我在 Booking.cs 中定义了这段代码。
  • 那你需要移动它。您只能在Booking 内添加转换为Booking 或从Booking 转换的转换运算符。
【解决方案2】:

运算符定义在什么类型中?该运算符只能在 timerangeResult 类中定义(因为 List&lt;Booking&gt;,另一个选项,不在您的控制范围内)

【讨论】:

    【解决方案3】:

    这就是我现在得到的 (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;
        }
    }
    

    现在我得到:“查询结果不能多​​次枚举。”

    【讨论】:

      猜你喜欢
      • 2014-09-13
      • 2016-11-24
      • 2021-03-15
      • 1970-01-01
      • 1970-01-01
      • 2019-07-13
      • 1970-01-01
      • 2014-02-12
      • 2014-04-18
      相关资源
      最近更新 更多