Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.05.2011, 12:09   #1
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию почему у меня шаблон не работает?

Пишет что: s' is a 'variable' but is used like a 'method'

Код:
using System;

delegate void some();

class abstract_exec<T>
{
  public static void exec(T s)
  { 
    //  вот здесь вот ругается
    //  s();
  }
}

class Program
  {
    static void Main(string[] args)
    {
      abstract_exec<some>.exec(() => { Console.WriteLine("method 6"); });
      Console.ReadKey();
    }
  }
the_deer_one вне форума Ответить с цитированием
Старый 13.05.2011, 18:44   #2
Spawn™Production®
Форумчанин
 
Аватар для Spawn™Production®
 
Регистрация: 06.05.2011
Сообщений: 287
По умолчанию

Ну, s и является переменной, а вы пытаетесь её как метод использовать...
если явно указать, что T это делегат, то должно сработать... студии под рукой нет, но вроде вот так:
Код:
class abstract_exec<T> where T: Delegate
{
  public static void exec(T s)
  { 
    //  вот здесь вот ругается
    //  s();
  }
}
Spawn™Production® вне форума Ответить с цитированием
Старый 16.05.2011, 13:10   #3
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

Spawn™Production®
Цитата:
Ну, s и является переменной, а вы пытаетесь её как метод использовать...
Ну так ведь делегаты так и вызываются.

Цитата:
where T: Delegate
Нее, так не хочет.
the_deer_one вне форума Ответить с цитированием
Старый 16.05.2011, 14:00   #4
m0nax
Форумчанин
 
Аватар для m0nax
 
Регистрация: 25.09.2009
Сообщений: 525
По умолчанию

Нельзя так, да и смысла не видно как-то
Сами делегаты могут быть обобщенными http://msdn.microsoft.com/ru-ru/libr...(v=VS.85).aspx
например так будет работать
Код:
delegate void some<T>();

class abstract_exec<T>
{
    public static void exec( some<T> s )
    {
          s();
    }
}

class Program
{
    static void Main( string[] args )
    {
        abstract_exec<some<int>>.exec(() => { Console.WriteLine("method 6"); });
        Console.ReadKey();
    }
}
m0nax вне форума Ответить с цитированием
Старый 16.05.2011, 14:39   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Код:
public static void exec( some<T> s )
а если у нас другой делегат, не some? Можно ведь просто вот так вызвать:

Код:
    public static void exec(T s)
    {
        (s as Delegate).DynamicInvoke();
    }
хотя смысла в классе class abstract_exec<T>, где T — делегат, действительно не так много, разве что для организации делегатов со "слабыми" ссылками на свои объекты, или подобной экзотики.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 16.05.2011 в 14:53.
veniside вне форума Ответить с цитированием
Старый 16.05.2011, 21:47   #6
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

veniside
Ясно.

Цитата:
хотя смысла в классе class abstract_exec<T>, где T — делегат, действительно не так много
Да я сам не придумал зачем это может понадобиться. Скорее для полноты картины спрашиваю. [offtop]Хм, в руби вообще пофиг экземпляра какого типа методы вызываются. Интерпретатор в любом случае попытается их вызвать.[/offtop]
the_deer_one вне форума Ответить с цитированием
Старый 16.05.2011, 23:15   #7
Spawn™Production®
Форумчанин
 
Аватар для Spawn™Production®
 
Регистрация: 06.05.2011
Сообщений: 287
По умолчанию

Да, к generic'ам делегаты не лепятся...
А вот так очень даже универсально получается.
Код:
        private void Form1_Load(object sender, EventArgs e)
        {
            var test1 = myCaller(new Func<string>(() => { return "test1"; }), null);
            Debug.Print(test1 == null ? "" : test1.ToString());
            var test2 = myCaller(new Action(() => { }), null);
            Debug.Print(test2 == null ? "" : test2.ToString());
            var test3 = myCaller(new Func<string, int>((s) => { return s.Length; }), "test3");
            Debug.Print(test3 == null ? "" : test3.ToString());
        }
        
        private object myCaller(Delegate someFunction, params object[] someParams)
        {
            return someFunction.DynamicInvoke(someParams);
        }
Spawn™Production® вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему программа на С++ не работает с локальным описанием массива, но работает с глобальным? >>STINGER<< Помощь студентам 4 08.03.2011 09:56
почему интеренет на Xp не работает, а на семерке работает Lenura Windows 18 04.10.2010 12:04
почему у меня програма не работает? Где ошибки? vova_makarovych Общие вопросы C/C++ 4 22.09.2010 18:27
У меня почему то TTabSheet не становиться невидимым. tonatas Общие вопросы Delphi 1 01.09.2010 12:52
Почему у меня картинка на кнопке вшивается в экзешник aleksandr278 Помощь студентам 2 13.03.2010 12:40