powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Генерик аргумент в функции.
13 сообщений из 13, страница 1 из 1
Генерик аргумент в функции.
    #38847429
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для одного типа делаю так
Код: c#
1.
2.
3.
4.
bool IsValueInRange(UInt32 val, int min_lim, int max_lim)
{
     return (val >= min_lim && val <= max_lim);
 }



а как сделать val генерик типом? Overload?
...
Рейтинг: 0 / 0
Генерик аргумент в функции.
    #38847436
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Generics (C# Programming Guide)
Extension Methods (C# Programming Guide)

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
void Main()
{
	5.IsValueInRange(2, 10).Dump();
	5.IsValueInRange(5, 6).Dump();
	5.IsValueInRange(3, 4).Dump();
	5.IsValueInRange(6, 7).Dump();	
	
}

public static class MyExtensions
{
	public static bool IsValueInRange<T>(this T _this, T min_lim, T max_lim) where T : IComparable<T>
	{
		return _this.CompareTo(min_lim) >= 0 && _this.CompareTo(max_lim) <= 0;
	}
}

...
Рейтинг: 0 / 0
Генерик аргумент в функции.
    #38847443
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7, generic версию сделать не получится т.к. нет возможности сообщить компилятору что тип поддерживает сравнение. Поэтому придется использовать перегрузку функций.
...
Рейтинг: 0 / 0
Генерик аргумент в функции.
    #38847445
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да наверное. на версии от buser получаю ошибку
Error 1 The type arguments for method 'ParamLoader.ExtensionMethod.IsValueInRange<T>(T, T, T)' cannot be inferred from the usage. Try specifying the type arguments explicitly.
...
Рейтинг: 0 / 0
Генерик аргумент в функции.
    #38847448
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7, версия buser работает. Покажи как ты её используешь.
...
Рейтинг: 0 / 0
Генерик аргумент в функции.
    #38847450
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bazilejenya7, версия buser работает. Покажи как ты её используешь.

в отдельном классе создаю
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
namespace ParamLoader
{
    public static class ExtensionMethod
    {
        public static bool IsValueInRange<T>(this T _this, T min_lim, T max_lim) where T : IComparable<T>
        {
            return _this.CompareTo(min_lim) >= 0 && _this.CompareTo(max_lim) <= 0;
        }
   

    }
}



и потом

Код: c#
1.
2.
3.
4.
5.
6.
7.
 UInt32 factor;
 if (UInt32.TryParse(textBoxFactor.Text, out factor))
 {
       if (factor.IsValueInRange(0, 8))   //тут ошибка
       {
       }
}
...
Рейтинг: 0 / 0
Генерик аргумент в функции.
    #38847452
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Генерик аргумент в функции.
    #38847454
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну для UInt32 я могу написать if (factor.IsValueInRange(0U, 8U))
а для Int32 и byte?
...
Рейтинг: 0 / 0
Генерик аргумент в функции.
    #38847455
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
factor.IsValueInRange(0u, 8u)


Если так не подходит, то используйте object для min/max
Код: c#
1.
2.
3.
4.
5.
	public static bool IsValueInRange<T>(this T _this, object min_lim, object max_lim) where T : IComparable<T>
	{
		
		return _this.CompareTo((T)Convert.ChangeType(min_lim, typeof(T))) >= 0 && _this.CompareTo((T)Convert.ChangeType(max_lim, typeof(T))) <= 0;
	}



Думалка работает неважно... дальше сами...
...
Рейтинг: 0 / 0
Генерик аргумент в функции.
    #38847457
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
buser
Код: c#
1.
factor.IsValueInRange(0u, 8u)


Если так не подходит, то используйте object для min/max
Код: c#
1.
2.
3.
4.
5.
	public static bool IsValueInRange<T>(this T _this, object min_lim, object max_lim) where T : IComparable<T>
	{
		
		return _this.CompareTo((T)Convert.ChangeType(min_lim, typeof(T))) >= 0 && _this.CompareTo((T)Convert.ChangeType(max_lim, typeof(T))) <= 0;
	}



Думалка работает неважно... дальше сами...

помогло явное приведение типов if (factor.IsValueInRange((byte)0, (byte)8)). спасибо.
...
Рейтинг: 0 / 0
Генерик аргумент в функции.
    #38847496
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Народ, а как потом все это сопровождать? Учите матчасть!
...
Рейтинг: 0 / 0
Генерик аргумент в функции.
    #38847528
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7Для одного типа делаю так


Смысл вообще в данном случае использовать генерики, если подразумевается, что оно должно работать с крайне ограниченным перечнем типов? Сделать нужное количество перегруженных методов под разные типы, и забыть.
...
Рейтинг: 0 / 0
Генерик аргумент в функции.
    #38848314
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Pallarisjenya7Для одного типа делаю так


Смысл вообще в данном случае использовать генерики, если подразумевается, что оно должно работать с крайне ограниченным перечнем типов? Сделать нужное количество перегруженных методов под разные типы, и забыть.
Сделал так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
bool IsValueInRange(UInt32 val, UInt32 min_lim, UInt32 max_lim)
{
      return (val >= min_lim && val <= max_lim);
}

bool IsValueInRange(Int32 val, Int32 min_lim, Int32 max_lim)
{
     return (val >= min_lim && val <= max_lim);
}

bool IsValueInRange(Byte val, Byte min_lim, Byte max_lim)
{
     return (val >= min_lim && val <= max_lim);
}


Ругается
Код: sql
1.
Error	2 The call is ambiguous between the following methods or properties: 'ParamLoader.SetGeneralForm.IsValueInRange(int, int, int)' and 'ParamLoader.SetGeneralForm.IsValueInRange(byte, byte, byte)'


Так что без кастинга никак.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Генерик аргумент в функции.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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