none
新手求助:很简单的问题 RRS feed

  • 问题

  • namespace test
    {
        class Program
        {
            private class my_class : Object
            {
                public string s;
            }

            static void Main(string[] args)
            {
                my_class x = new my_class();
                List<my_class> my_list = new List<my_class>();
                my_list.Add(x);

                my_func(my_list); //为什么这行会有错误?
            }

            private static void my_func(List<Object> o)
            {
                ;
            }
        }
    }

    2012年1月4日 9:58

答案

  • namespace test
    {
        class Program
        {
            private class my_class : Object
            {
                public string s;
            }

            static void Main(string[] args)
            {
                my_class x = new my_class();
                List<my_class> my_list = new List<my_class>();
                my_list.Add(x);

                my_func(my_list); //为什么这行会有错误?
            }

            private static void my_func(List<Object> o)
            {
                ;
            }
        }
    }

    mylist是List<my_class>类型,但是my_func的传参却要求是List<Object>类型,也就是说你要把List<my_class>=>List<Object>类型,这个在C#语法上显然是不行的(不要认为my_class是子类,object是父类哦!因为系统会以为如果你调用o.Add的方法需要一个object参数的实体类,这个类是五花八门的……比如string也可以传入)。但是string类不能存入List<my_class>中,存在强制转换错误问题。

    解决方法:

     private static void my_func(List<my_class> o)


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年1月5日 2:45
    版主
  • 楼主的代码涉及到泛型的逆变和协变。目前,泛型里只有泛型委托和泛型接口支持逆变和协变T参数,而List<T>不支持,所以楼主的代码虽然逻辑上可行,但是实际上是不支持的。

    如果楼主一定要那么做,可以这样变通一下:

    my_func(my_list.OfType<Object>().ToList())
    




    理解的越多,需要记忆的就越少
    2012年1月5日 3:18
    版主

全部回复

  • 用泛型就可以了
    class Program
        {
            private class my_class : Object
            {
                public string s;
            }
            static void Main(string[] args)
            {
                my_class x = new my_class();
                List<my_class> my_list = new List<my_class>();
                my_list.Add(x);
                my_func(my_list);
            }
            private static void  my_func <T> (List<T> o)
            {
                ;
            }
        }
    2012年1月4日 11:05
  • namespace test
    {
        class Program
        {
            private class my_class : Object
            {
                public string s;
            }

            static void Main(string[] args)
            {
                my_class x = new my_class();
                List<my_class> my_list = new List<my_class>();
                my_list.Add(x);

                my_func(my_list); //为什么这行会有错误?
            }

            private static void my_func(List<Object> o)
            {
                ;
            }
        }
    }

    mylist是List<my_class>类型,但是my_func的传参却要求是List<Object>类型,也就是说你要把List<my_class>=>List<Object>类型,这个在C#语法上显然是不行的(不要认为my_class是子类,object是父类哦!因为系统会以为如果你调用o.Add的方法需要一个object参数的实体类,这个类是五花八门的……比如string也可以传入)。但是string类不能存入List<my_class>中,存在强制转换错误问题。

    解决方法:

     private static void my_func(List<my_class> o)


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年1月5日 2:45
    版主
  • 楼主的代码涉及到泛型的逆变和协变。目前,泛型里只有泛型委托和泛型接口支持逆变和协变T参数,而List<T>不支持,所以楼主的代码虽然逻辑上可行,但是实际上是不支持的。

    如果楼主一定要那么做,可以这样变通一下:

    my_func(my_list.OfType<Object>().ToList())
    




    理解的越多,需要记忆的就越少
    2012年1月5日 3:18
    版主