Вызов "неизвестного" метода из шаблона
От: KA it-knowledge-base.blogspot.com
Дата: 03.01.11 15:10
Оценка:
Всем привет,

есть код:
using System.Collections.Generic;

namespace EqualsTest
{
  class Super
  {
    public void Everything() { }
  }
  class Container<T> : List<T> where T: class
  {
    public void DoEverything()
    {
      foreach (T item in this)
        item.Everything();
    }
  }
  class Program
  {
    static void Main(string[] args)
    {
      Container<Super> con1 = new Container<Super>();
      con1.Add(new Super());
      con1.DoEverything();
    }
  }
}

который не компилируется из-за строки item.Everything() с ошибкой

UnknownTest.cs(14,14): error CS1061: 'T' does not contain a definition for 'Everything' and no extension method 'Everything' accepting a first argument of type 'T' could be found (are you missing a using directive or an assembly reference?)


Что надо скормить компилятору, чтобы подобные конструкции заработали?
Не хотелось бы вводить для этого интерфейс.
Я предполагаю, что в момент компиляции шаблона тип элементов действительно может быть не известен, но в точке инстанцирования уже все нужные классы видны полностью (их может быть несколько разных), так что компилятор должен догадаться, что нужный метод у класса элемента есть...

Заранее благодарю за ц.у. )
//
#import <windows.bas>
class IWindows9x:protected DOS { private: virtual HANDLE EnumClouds()=0; };
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.