【问题标题】:C# Implicit casting to List<T> returns runtime errorC# 隐式转换为 List<T> 返回运行时错误
【发布时间】:2010-10-27 19:18:31
【问题描述】:

我有一个类似于以下使用内部列表的类:

public class MyList<T> : IEnumerable<T>
{
        private List<T> _lstInternal;
        public MyList()
        {
            _lstInternal = new List<T>();
        }
        public static implicit operator List<T>(MyList<T> toCast)
        {
            return toCast._lstInternal;
        }

}

当我尝试将MyList&lt;object&gt; 传递给采用List&lt;object&gt; 的函数时,我得到一个InvalidCastException。为什么?

【问题讨论】:

  • 您使用的是什么版本的 C#?我正在使用 4.0 并且能够在没有 InvalidCastException 的情况下执行您在此处描述的操作。
  • 你有什么理由不只是从List&lt;T&gt;派生?
  • @CodeInChaos,然后该类的用户将能够改变列表或通过索引器访问它。也许作者不想公开该功能。
  • 我没有使用 .NET 2.0 获得异常,您可以发布您有异常的行吗?
  • @Anthony Pegram 他已经通过公共隐式转换运算符公开了它。他只隐藏了类似于显式接口实现的方法。

标签: c# operator-keyword implicit implicit-conversion


【解决方案1】:

使用您描述的类,以下代码对我有用:

static void Main(string[] args)
{
   MyList<object> foo = new MyList<object>();

   MyMethod(foo);
}

static void MyMethod(List<object> things)
{
   // No InvalidCastException when called...
}

我对您在问题中发布的MyList&lt;T&gt; 课程的唯一更改是添加了IEnumerable&lt;T&gt; 的以下实现:

IEnumerator<T> IEnumerable<T>.GetEnumerator()
{
    return _lstInternal.GetEnumerator();
}

IEnumerator IEnumerable.GetEnumerator()
{
    return _lstInternal.GetEnumerator();
}

不太清楚为什么会出现异常,除非我在评论中提到,我使用的是 C# 版本 4.0。你用的是什么版本?

【讨论】:

  • 实际上我的问题是我将对象传递给另一个项目,该项目不知道 MyList 类,因此它不知道如何转换它。所以现在我只是在将 MyList 发送到另一个项目之前进行投射。
猜你喜欢
  • 1970-01-01
  • 2010-10-06
  • 2012-07-22
  • 2018-11-19
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多