Чем стандартный SCG.List[] отличается от самописного?
От: Jack128  
Дата: 26.09.09 12:45
Оценка: 44 (1)
Итак, есть самопальный MyList[], который реализует интерфейсы SCG.IList[T], SCG.ICollection[T], SCG.IEnumerable[T], SC.IEnumerable

и есть код:
        //class MyListOfList : MyList[SCG.List[object]]
        class MyListOfList : SCG.List[SCG.List[object]]
        {
            public this() {}
        }
        
      class Test
      {
        public Test(): void
        {
            foreach (i in Ints)
            {
                   WriteLine(i.Count);
            }
        }        
        Ints: MyListOfList = MyListOfList();
      }

так вот, если предком ListOfList делать стандартный лист, то код работает нормально, а вот если предком делать мой самописный лист, то переменная i интерпритируется как object и соответственно на строчке WriteLine(i.Count); имеем ошибку компиляции.
Собственно стандартные вопросы: кто виноват и что делать? -)

Полный код:


using System;
using System.Console;
using Nemerle.Utility;
using Nemerle.Collections;
using System.Collections;
using System.Collections.Generic;

using SC = System.Collections;
using SCG = System.Collections.Generic;

module Program
{   
     
        public class MyList[T] : SCG.IList[T], SCG.ICollection[T], SCG.IEnumerable[T], SC.IEnumerable

        {

            public this()
            {
                
            }

            public Add(item : T) : void
            {
                _list.Add(item);
            }

            public Remove(item: T) : bool
            {
                def index = _list.IndexOf(item);
                def result = index >= 0;
                when (result)
                    RemoveAt(index);

                result;
            }

            public Count : int
            {
                get { _list.Count; }
            }

            public Clear() : void
            {
                while (Count > 0)
                    RemoveAt(0);
            }

            public IndexOf(item : T) : int
            {
                _list.IndexOf(item);
            }

            public Insert(index: int, item: T) : void
            {                
                _list.Insert(index, item);             
            }

            public RemoveAt(index: int) : void
            {                
                _list.RemoveAt(index);                
            }

            public Item[index: int] : T 
            {
                get { _list[index]; }
                set { throw NotImplementedException(); _ = index; _ = value; }
            }

            public Contains(item : T): bool
            {
                _list.Contains(item);
            }

            _list : SCG.List[T] = SCG.List.[T]();
            IEnumerable_T_GetEnumerator(): IEnumerator[T] implements SCG.IEnumerable[T].GetEnumerator
            {
                (_list : IEnumerable[T]).GetEnumerator();
            }

            IEnumerable_GetEnumerator(): IEnumerator implements SC.IEnumerable.GetEnumerator 
            {
                (_list : IEnumerable).GetEnumerator();
            }

            ICollection_T_CopyTo(_array: array[T], arrayIndex: int) : void implements SCG.ICollection[T].CopyTo
            {
                _list.CopyTo(_array, arrayIndex);
            }

            ICollection_T_IsReadOnly : bool implements SCG.ICollection[T].IsReadOnly
            {
                get { (_list : SCG.ICollection[T]).IsReadOnly; }
            }
        }
        
        //class MyListOfList : MyList[SCG.List[object]]
        class MyListOfList : SCG.List[SCG.List[object]]
        {
            public this() {}
        }
        
      class Test
      {
        public Test(): void
        {
            foreach (i in Ints)
            {
                   WriteLine(i.Count);
            }
        }        
        Ints: MyListOfList = MyListOfList();
      }
    
    Main() : void
    {       
        
        _ = ReadKey(false);
    }

}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.