powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Argument type 'T' is not assignable to parameter type X
7 сообщений из 7, страница 1 из 1
Argument type 'T' is not assignable to parameter type X
    #39037838
newbie3732
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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.
27.
28.
29.
30.
31.
32.
33.
34.
    interface ISmth
    {
        void DoSmth<T>(T value);
    }

    class Smth : ISmth
    {
        public void DoSmth<T>(T value)
        {
            //DoSmthSmth(value); // ошибка
            if (value is string)
                DoSmthSmth(value as string);
            else if(value is List<string>)
                DoSmthSmth(value as List<string>);
            else if(value is Exception)
                DoSmthSmth(value as Exception);
        }

        void DoSmthSmth(string value) {}
        void DoSmthSmth(List<string> value) {}
        void DoSmthSmth(Exception value) {}
    }

    class Program
    {
        static void Main(string[] args)
        {
            ISmth smth = new Smth();

            smth.DoSmth("string");
            smth.DoSmth(new List<string> { "l", "i", "s", "t" });
            smth.DoSmth(new Exception("exception"));
        }
    }



как правильно заменить выделенную лесенку if..else if?
...
Рейтинг: 0 / 0
Argument type 'T' is not assignable to parameter type X
    #39037869
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
newbie3732,

если в генерик-методе начинаешь анализировать, какой у тебя тип генерика - значит делаешь что-то не то. Генерик-то и создается, чтобы не заботиться о том, какой тип тебе приходит на вход.
Если нужно по-разному обрабатывать разные типы, то :

Код: c#
1.
2.
3.
4.
5.
6.
interface ISmth
    {
        void DoSmthWithString(string value);
        void DoSmthWithListOfStrings(List<string> value);
        void DoSmthWithException(Exception value);
    }
...
Рейтинг: 0 / 0
Argument type 'T' is not assignable to parameter type X
    #39037877
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pallaris, +1

Если мало сахару, то dynamic или ExpandoObject... хенерики в примере - выглядят странно и не к месту...
Код: c#
1.
2.
3.
4.
5.
        public void DoSmth<T>(T value)
        {
            dynamic mv = value;			
	    DoSmthSmth(mv);
        }
...
Рейтинг: 0 / 0
Argument type 'T' is not assignable to parameter type X
    #39037888
newbie3732
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Pallarisесли в генерик-методе начинаешь анализировать, какой у тебя тип генерика - значит делаешь что-то не то. Генерик-то и создается, чтобы не заботиться о том, какой тип тебе приходит на вход.

Потому и спрашиваю.
PallarisЕсли нужно по-разному обрабатывать разные типы, то :
Код: c#
1.
2.
3.
4.
5.
6.
interface ISmth
    {
        void DoSmthWithString(string value);
        void DoSmthWithListOfStrings(List<string> value);
        void DoSmthWithException(Exception value);
    }


Интерфейс выставлен сторонней библиотекой.
buser
Код: c#
1.
2.
3.
4.
5.
        public void DoSmth<T>(T value)
        {
            dynamic mv = value;			
	    DoSmthSmth(mv);
        }


Спасибо - помогло.
...
Рейтинг: 0 / 0
Argument type 'T' is not assignable to parameter type X
    #39037891
newbie3732
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
buserхенерики в примере - выглядят странно и не к месту...

https://github.com/uhaciogullari/NLog.Interface/blob/master/NLog.Interface/ILogger.cs
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
namespace NLog.Interface
{
  public interface ILogger
  {

    void Log<T>(LogLevel level, T value);

    void Log<T>(LogLevel level, IFormatProvider formatProvider, T value);

  }
}
...
Рейтинг: 0 / 0
Argument type 'T' is not assignable to parameter type X
    #39037895
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
newbie3732buserхенерики в примере - выглядят странно и не к месту...

https://github.com/uhaciogullari/NLog.Interface/blob/master/NLog.Interface/ILogger.cs
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
namespace NLog.Interface
{
  public interface ILogger
  {

    void Log<T>(LogLevel level, T value);

    void Log<T>(LogLevel level, IFormatProvider formatProvider, T value);

  }
}




а ниже внезапно

Код: c#
1.
void LogException(LogLevel level, [Localizable(false)] string message, Exception exception);



При этом в реализации Log<T>(LogLevel level, T value) кроме value.ToString() нифига и не будет заумного.
...
Рейтинг: 0 / 0
Argument type 'T' is not assignable to parameter type X
    #39037905
newbie3732
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Pallaris
Код: c#
1.
void LogException(LogLevel level, [Localizable(false)] string message, Exception exception);



Но мне выставили только
Код: c#
1.
2.
3.
4.
interface ISmth
    {
        void DoSmth<T>(T value);
    }
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Argument type 'T' is not assignable to parameter type X
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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