powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Чем заменить Func<>?
16 сообщений из 16, страница 1 из 1
Чем заменить Func<>?
    #39238169
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пытаюсь компильнуть код под 3.5, там есть такое объявление

Код: c#
1.
public TValue AddOrUpdate(TKey key, TValue value, Func<TKey, TValue, TValue> updateValueFactory)



Дает ошибку

Код: c#
1.
Error:  CS0246: The type or namespace name 'Func' could not be found (are you missing a using directive or an assembly reference?)



Чем заменить?
...
Рейтинг: 0 / 0
Чем заменить Func<>?
    #39238174
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
делегатом
...
Рейтинг: 0 / 0
Чем заменить Func<>?
    #39238175
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин, подключить mscorlib.dll в референсах пробовали?
...
Рейтинг: 0 / 0
Чем заменить Func<>?
    #39238217
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Axeleron,
Там она скорее есть, нужно просто using System;
...
Рейтинг: 0 / 0
Чем заменить Func<>?
    #39238220
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
добавил mscorlib
а
using System;

и так был.

не катит.
...
Рейтинг: 0 / 0
Чем заменить Func<>?
    #39238266
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,
Тогда не 3,5, меньше
...
Рейтинг: 0 / 0
Чем заменить Func<>?
    #39238402
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВРолг Хупин,
Тогда не 3,5, меньше

Изменил на 4 - ошибок нет
Вернул 3.5 - ошибка.
...
Рейтинг: 0 / 0
Чем заменить Func<>?
    #39238469
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

В .net 3.5 Func<> лежит в сборке System.Core.dll: https://msdn.microsoft.com/ru-ru/library/bb549151(v=vs.90).aspx
Добавьте ссылку :)
...
Рейтинг: 0 / 0
Чем заменить Func<>?
    #39238552
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выше же сказали - генерик-делегатом.
https://msdn.microsoft.com/en-us/library/bb534647(v=vs.110).aspx :
Код: c#
1.
2.
3.
4.
public delegate TResult Func<in T1, in T2, out TResult>(
	T1 arg1,
	T2 arg2
)


и вышеприведенный метод переписывается так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
class Program
{
  static void Main(string[] args)
  {
    new Foo<int, string>().AddOrUpdate(0, string.Empty, Foo);
  }

  static string Foo(int key, string value)
  {
    return string.Empty;
  }
}

public delegate TResult TripleFunc<in TKey, in TValue, out TResult>(TKey key, TValue value);

public class Foo<TKey, TValue>
{
  public TValue AddOrUpdate(TKey key, TValue value, TripleFunc<TKey, TValue, TValue> updateValueFactory)
  {
    return default(TValue);
  }
}


- под 3.5 вполне нормально компилируется студией, начиная с 2010-й (насчет 2008-й не уверен - не помню, когда компилятор стал поддерживать спецификаторы ковариантности/контрвариантности - но откуда сейчас взять эту древнюю 2008-ю?)
...
Рейтинг: 0 / 0
Чем заменить Func<>?
    #39238617
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны- под 3.5 вполне нормально компилируется студией, начиная с 2010-й (насчет 2008-й не уверен - не помню, когда компилятор стал поддерживать спецификаторы ковариантности/контрвариантности - но откуда сейчас взять эту древнюю 2008-ю?)
Нововведением 3,5 был в частности LINQ, для этого были введены Expersion, анонимные типы, вывод типов ну и Func/Action.
Нововведением 4,0 были в частности ко/контрвариантность и dynamic.
...
Рейтинг: 0 / 0
Чем заменить Func<>?
    #39238718
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВНововведением 3,5 был в частности LINQ, для этого были введены Expersion, анонимные типы, вывод типов ну и Func/Action.
Нововведением 4,0 были в частности ко/контрвариантность и dynamic.
Тут, пардон, в кучу кони/люди. Анонимные типы/вывод типов - это фича версии языка 3.0 (т.е. компилятора), как и ко/контрвариантность в версии языка 4.0. С версией CLR это никак не коррелирует, т.к. никак не завязано на классы FCL. Вот такой код вполне нормально скомпилируется даже под Framework 2.0 в студии начиная от 2010, и выше:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
class Program
{
  static void Main(string[] args)
  {
    var res1 = new Foo<int, string>().AddOrUpdate(0, string.Empty, Foo);
    var res2 = new Foo<int, string>().AddOrUpdate(0, string.Empty, (n, s) => new {N=n, S=s}.S);
  }

  static string Foo(int key, string value)
  {
    return string.Empty;
  }
}

public delegate TResult TripleFunc<in TKey, in TValue, out TResult>(TKey key, TValue value);

public class Foo<TKey, TValue>
{
  public TValue AddOrUpdate(TKey key, TValue value, TripleFunc<TKey, TValue, TValue> updateValueFactory)
  {
    return default(TValue);
  }
}
...
Рейтинг: 0 / 0
Чем заменить Func<>?
    #39238817
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныТут, пардон, в кучу кони/люди. Анонимные типы/вывод типов - это фича версии языка 3.0 (т.е. компилятора), как и ко/контрвариантность в версии языка 4.0. С версией CLR это никак не коррелирует, т.к. никак не завязано на классы FCL. Вот такой код вполне нормально скомпилируется даже под Framework 2.0 в студии начиная от 2010, и выше:

Скомпилируется потому, что не используется ко/контравариантность и потому, что 4,0 при установке меняет csc от 2,0. Хотя почему не ругается для меня загадка... Причем не ругается и на dynamic....
Но, попробуй скомпилировать это в 2,0 и 4,0
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
    public class Base { }
    public class First : Base { }
    class Program
    {
        static void Main(string[] args)
        {
            
            TripleFunc<First, First, Base> s = new Foo<Base, First>().AddOrUpdate(new First(), new First(), (a, b) => 
            {
                return b;
            });
        }
        static string Foo(int key, string value)
        {
            return string.Empty;
        }
    }
    public delegate TResult TripleFunc<in TKey, in TValue, out TResult>(TKey key, TValue value);

    public class Foo<TKey, TValue>
    {
        public TValue AddOrUpdate(TKey key, TValue value, TripleFunc<TKey, TValue, TValue> updateValueFactory)
        {
            return default(TValue);
        }
    }
...
Рейтинг: 0 / 0
Чем заменить Func<>?
    #39238844
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВНо, попробуй скомпилировать это в 2,0 и 4,0
Не скомпилируется нигде вообще - TripleFunc<in TKey, in TValue, out TResult> никак не привести к результату вызова AddOrUpdate, т.е. TResult. А вот такое:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
public class Base { }
public class First : Base { }
class Program
{
  static void Main(string[] args)
  {
    new Foo<Base, First>().AddOrUpdate(new First(), new First(), (a, b) => b);
  }
}

public delegate TResult TripleFunc<in TKey, in TValue, out TResult>(TKey key, TValue value);

public class Foo<TKey, TValue>
{
  public TValue AddOrUpdate(TKey key, TValue value, TripleFunc<TKey, TValue, TValue> updateValueFactory)
  {
    return default(TValue);
  }
}


нормально компилируется и там, и там. В IL при этом создается идентичное объявление TripleFunc:
Код: c#
1.
2.
3.
4.
.class public auto ansi sealed test2.TripleFunc`3<- TKey,- TValue,+ TResult>
       extends [mscorlib]System.MulticastDelegate
{
} // end of class test2.TripleFunc`3
...
Рейтинг: 0 / 0
Чем заменить Func<>?
    #39238872
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,
Да, что то я не туда погнал :(
Но все равно in, out в делегатах и интерфейсах и dynamic появились только в .NET 4.0
...
Рейтинг: 0 / 0
Чем заменить Func<>?
    #39238900
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да и
Код: c#
1.
System.Collections.Generic.IEnumerable<Base> list = new System.Collections.Generic.List<First>();


Пройдет в 4,0 и не пройдет в 2,0
...
Рейтинг: 0 / 0
Чем заменить Func<>?
    #39238970
Ilya81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только сигнатура мне сильно напоминает один из методов класса ConcurrentDictionary, который появился в .Net 4.5.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Чем заменить Func<>?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]