Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / c# Func generic / 25 сообщений из 34, страница 1 из 2
15.10.2015, 10:44
    #39077314
Nechto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Func generic
Здравствуйте!

Хочу задать вопрос из любопытства. Просто очень интересно возможна ли данная реализация.

Имеется дженерик функция:
Код: c#
1.
public string function GetTypeMy<T>(T value) {};



Можно ли данную функцию объявить средствами Func<T>, типа этого:
Код: c#
1.
public Func<T, string> Pe() = (p => p);
...
Рейтинг: 0 / 0
15.10.2015, 10:53
    #39077323
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Func generic
NechtoИмеется дженерик функция:
Код: c#
1.
public string function GetTypeMy<T>(T value) {};

не имеется, она должна возвращать значение

NechtoМожно ли данную функцию объявить средствами Func<T>, типа этого:
Код: c#
1.
public Func<T, string> Pe() = (p => p);

типа этого - это вот так?
Код: c#
1.
public Func<string, string> Pe = p => p
...
Рейтинг: 0 / 0
15.10.2015, 11:05
    #39077349
Nechto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Func generic
Shocker.ProNechtoИмеется дженерик функция:
Код: c#
1.
public string function GetTypeMy<T>(T value) {};

не имеется, она должна возвращать значение

NechtoМожно ли данную функцию объявить средствами Func<T>, типа этого:
Код: c#
1.
public Func<T, string> Pe() = (p => p);

типа этого - это вот так?
Код: c#
1.
public Func<string, string> Pe = p => p



Спасибо! А то были сомнения в невозможности реализации.
...
Рейтинг: 0 / 0
15.10.2015, 11:17
    #39077368
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Func generic
Я так и не понял, за что спасибо, ну да ладно )
...
Рейтинг: 0 / 0
15.10.2015, 11:25
    #39077381
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Func generic
Вообще то как то так.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 public static string  GetTypeMy<T>(T value)
        {
            return "1";
        }
        Func<T, string> fun = x => GetTypeMy<T>(x);//так низя, T - непонятно что
        Func<int, string> fun1 = x => GetTypeMy(10);//так можно, T - int
        public interface IMy { }
        public class CMy : IMy { }
        Func<IMy, string> fun2 = x => GetTypeMy(new CMy());// так можно начиная с .NET 4.0 ибо в Func<T, TResult> T -ковариантный TResult - контрвариантный
        public class CMy1<T>
        {
            Func<T, string> fun = x => GetTypeMy(x);// так можно, T обобщенный параметр класса
        }
...
Рейтинг: 0 / 0
15.10.2015, 11:57
    #39077437
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Func generic
Func это указатель на метод, а не сам метод, не понял, что хочет автор?
вернуть указатель на функцию?
...
Рейтинг: 0 / 0
15.10.2015, 13:28
    #39077577
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Func generic
Roman MejtesFunc это указатель на метод, а не сам метод, не понял, что хочет автор?
вернуть указатель на функцию?
Func - обобщенный делегат с параметрами ковариантного ковариантного типа и контрвариантным возвращаемым значением.
...
Рейтинг: 0 / 0
15.10.2015, 15:16
    #39077748
EV.P
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Func generic
Как же так??? А как же я???

Допустим, гадо написать функцию, которая выполняет какую-нибудь логическую операцию над двумя операндами в соответствии с той операцией, которая занесена в строку. Я попытался сделать как ниже, но так не получилось. Выдаётся сообщение "Оператор вида “>” не может применяться к операндам вида <T> и <T>".

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
private bool cmpStr<T>(string s, T c1, T c2)
{
    if (s == ">") return c1 > c2;
    else if (s == ">=") return c1 >= c2;
    else if (s == "==") return c1 == c2;
    else if (s == "<=") return c1 <= c2;
    else if (s == "<") return c1 < c2;
    else return false;
}



Собственно, проблема в том, что generic имеет тут явные ограничения не может применяться для сравнения объектов. И поэтому придётся корячиться и писать что-то вроде:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
cmpStr<T>(string s, T c1, T c2) where T : MyType

public class MyType 
{
    public int Value;

    public static bool operator <(MyType  a1, MyType a2)
    {
        return a1.Value < a2.Value;
    }

    public static bool operator >(MyType a1, MyType a2)
    {
        return a1.Value > a2.Value;
    }

    ...
}



Так? Так!
...
Рейтинг: 0 / 0
15.10.2015, 15:29
    #39077764
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Func generic
Вот не надо вот методом тыка все делать.

Во-первых, изучите разницу между ссылочными типами и структурами
Во-вторых, изучите компараторы, интерфейс IComparable и т.п.

Это слишком длинно, чтобы изложить в одном посте, но в любом учебнике это есть.
После прочтения вопросы отпадут.
...
Рейтинг: 0 / 0
15.10.2015, 16:10
    #39077828
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Func generic
EV.P
Так? Так!
Согласен, разработчики C# могли бы разрешить использование операторов в таких случаях или в качестве ограничений на generic аргументы. И вообще этот язык сейчас используют только старые и ленивые программисты, которые не в состоянии научиться новому и прогрессивному!

Например в самом современном и прогрессивном языке F# делают так!
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
module MyTest

let cmpStr s c1 c2 =
    match s with
    | ">" -> c1 > c2
    | ">=" -> c1 >= c2
    | "=" -> c1 = c2
    | "<=" -> c1 <= c2
    | "<" -> c1 < c2
    | _ -> false

let r1 = MyTest.cmpStr ">" 1 "w"//IDE и компилятор ругаются, тут к int и string нельзя применить Basic Comparison Operations
let r2 = MyTest.cmpStr "<" 1 2//тут все хорошо!
...
Рейтинг: 0 / 0
15.10.2015, 16:20
    #39077841
EV.P
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Func generic
ЕвгенийВ,

Странно, но у меня что-то стал глючить сам компилятор .Net.
Вот код, который прекрасно компилируется и даже кое-как работает!

Код: 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)
        {
         
        }

        class Poezd
        {
            private int poezd = "туту!";
            
            public Poezd():this(5)
            {
                
            }

            public Poezd(int i):this()
            {
                
            }
        }

    }



Я думаю, что проблема тут в том, что .Net предусматривает неявную типизацию, определяемую ключевым словом var, которое пытались сделать полем класса. Так?
...
Рейтинг: 0 / 0
15.10.2015, 16:27
    #39077847
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Func generic
EV.P,
Какие C# Compiler Options использовал при компиляции?
...
Рейтинг: 0 / 0
16.10.2015, 12:05
    #39078478
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Func generic
ЕвгенийВRoman MejtesFunc это указатель на метод, а не сам метод, не понял, что хочет автор?
вернуть указатель на функцию?
Func - обобщенный делегат с параметрами ковариантного ковариантного типа и контрвариантным возвращаемым значением.
ну да, а делегат значит не указатель не метод? :)
просто если человек просит о помощи, слово делегат, вызывает у него еще 100500 вопросов
...
Рейтинг: 0 / 0
16.10.2015, 13:06
    #39078561
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Func generic
Roman Mejtesпросто если человек просит о помощи, слово делегат, вызывает у него еще 100500 вопросов
С простым указателем на метод такое например проканает?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
Func<int> fun = () => 4;
            var x2 = fun.DynamicInvoke();
            var x3 = fun();
            var x4 = fun.BeginInvoke(async => 
            {
                var x5 = (async.AsyncState as Func<int>).EndInvoke(async);
            }, fun);
            fun += () => 7;
            var x1 = fun.GetInvocationList().OfType<Func<int>>().Select(z => z());
...
Рейтинг: 0 / 0
18.10.2015, 12:12
    #39079285
Nechto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Func generic
ЕвгенийВEV.PТак? Так!
Согласен, разработчики C# могли бы разрешить использование операторов в таких случаях или в качестве ограничений на generic аргументы. И вообще этот язык сейчас используют только старые и ленивые программисты, которые не в состоянии научиться новому и прогрессивному!

Например в самом современном и прогрессивном языке F# делают так!
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
module MyTest

let cmpStr s c1 c2 =
    match s with
    | ">" -> c1 > c2
    | ">=" -> c1 >= c2
    | "=" -> c1 = c2
    | "<=" -> c1 <= c2
    | "<" -> c1 < c2
    | _ -> false

let r1 = MyTest.cmpStr ">" 1 "w"//IDE и компилятор ругаются, тут к int и string нельзя применить Basic Comparison Operations
let r2 = MyTest.cmpStr "<" 1 2//тут все хорошо!



Евгений, и в чем же его F# прогресcивность? Строгая типизация, так это уже и в паскале было.
...
Рейтинг: 0 / 0
19.10.2015, 11:41
    #39079876
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Func generic
Nechto
Евгений, и в чем же его F# прогресcивность? Строгая типизация, так это уже и в паскале было.
При чем тут строгая типизация?
В F# более мощная система типов и еще много всяких вкусностей.
...
Рейтинг: 0 / 0
21.10.2015, 12:34
    #39082286
Nechto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Func generic
ЕвгенийВNechtoЕвгений, и в чем же его F# прогресcивность? Строгая типизация, так это уже и в паскале было.
При чем тут строгая типизация?
В F# более мощная система типов и еще много всяких вкусностей.

Синтаксис языка какой-то не привычный. Хотя это дело привычки. Нужно будет попробовать, его в действии.
...
Рейтинг: 0 / 0
21.10.2015, 12:38
    #39082292
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Func generic
ЕвгенийВ... использование операторов ...Макросы ещё надо как в C/C++, чтобы все окончательно запутались.
...
Рейтинг: 0 / 0
21.10.2015, 13:12
    #39082331
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Func generic
Алексей КМакросы ещё надо как в C/C++, чтобы все окончательно запутались.
Нафига макросы, когда можно нормальный DSL делать, как тут например .
...
Рейтинг: 0 / 0
21.10.2015, 14:12
    #39082389
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Func generic
ЕвгенийВАлексей КМакросы ещё надо как в C/C++, чтобы все окончательно запутались.
Нафига макросы, когда можно нормальный DSL делать, как тут например .
хабр
авторНачнем с того, что обсудим что же такое DSL. DSL – доменно специфичный язык – то есть способ описания той или иной предметной специфики (которая часто связана с конкретной индустрией) с помощью такого языка, который могут понять не только разработчики, но и эксперты в предметной области. Важно в этом языке то, что те кто его используют не должны думать о фигурных скобочках, точках с запятой и прочих прелестях программирования. То есть у них должна быть возможность писать на «простом английском» (русском, японском, и т.д.)Опять несбыточная мечта о программировании непрограммистами. Неудобного SQL и без того хватает.
...
Рейтинг: 0 / 0
21.10.2015, 15:15
    #39082512
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Func generic
Алексей КОпять несбыточная мечта о программировании непрограммистами. Неудобного SQL и без того хватает.
На SQL программируют непрограммисты?
...
Рейтинг: 0 / 0
21.10.2015, 15:18
    #39082514
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Func generic
Сон Веры ПавловныАлексей КОпять несбыточная мечта о программировании непрограммистами. Неудобного SQL и без того хватает.
На SQL программируют непрограммисты?По факту нет. Но цели при создании были такими же. Вики :
авторЦелью разработки было создание простого непроцедурного языка, которым мог воспользоваться любой пользователь, даже не имеющий навыков программирования.
...
Рейтинг: 0 / 0
21.10.2015, 15:19
    #39082515
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Func generic
зы: История людей ничему не учит.
...
Рейтинг: 0 / 0
22.10.2015, 11:39
    #39083236
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Func generic
Алексей КПо факту нет. Но цели при создании были такими же.
Ну и само определение программиста размыто. Для кого то это всякий, кто может переставить Windows, для меня это люди масштаба Кодда, Кнута, Хесберга или Страуструпа со Степановым.
...
Рейтинг: 0 / 0
22.10.2015, 12:00
    #39083282
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Func generic
ЕвгенийВАлексей КПо факту нет. Но цели при создании были такими же.
Ну и само определение программиста размыто. Для кого то это всякий, кто может переставить Windows, для меня это люди масштаба Кодда, Кнута, Хесберга или Страуструпа со Степановым.
при этом совсем не факт, что они себя при этом считали программистами :)
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / c# Func generic / 25 сообщений из 34, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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