powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Поясните с классами в C#
25 сообщений из 33, страница 1 из 2
Поясните с классами в C#
    #38725241
Фотография Cheerful Calf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может ошибся веткой, звиняйте...
Почему во втором случае q всегда null? и как можно скастить IEnumerable<Human> в IEnumerable<Boy>?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
public class Human
{
  public int Id {get; set;}
}

public class HumanServices
{
  public IEnumerable<Human> GetHumans(){...};
}

public class Boy : Human
{
  //public new int Id {get; set;} ?тут?
  public int Age {get; set;}
}

static void Main()
{
  var q;
  q = HumanServices.GetHumans();
  q = HumanServices.GetHumans() As IEnumerable<Boy>;
}
...
Рейтинг: 0 / 0
Поясните с классами в C#
    #38725284
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
HumanServices.GetHumans().Select(n => (Boy)n)
...
Рейтинг: 0 / 0
Поясните с классами в C#
    #38725296
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro, Вы вообще поняли, что предложили? Как только ТС дёрнет полученный энумератор, так сразу получит InvalidCastException.
...
Рейтинг: 0 / 0
Поясните с классами в C#
    #38725297
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
var boys = HumanServices.GetHumans().Cast<Boy>();
...
Рейтинг: 0 / 0
Поясните с классами в C#
    #38725303
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К
Код: c#
1.
var boys = HumanServices.GetHumans().Cast<Boy>();

Ещё один советчик

Вы вообще обратили внимание на то, что Boy - это наследник от Human?
...
Рейтинг: 0 / 0
Поясните с классами в C#
    #38725313
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если бы у ТС внутри метода GetHumans() коллекция наполнялась экземплярами класса Boy, то работало бы преобразование HumanServices.GetHumans() as IEnumerable<Boy>.

Но as возрашает null , следовательно преобразование не возможно.
Следовательно (IEnumerable<Boy>)HumanServices.GetHumans() , HumanServices.GetHumans().Select(n => (Boy)n) и HumanServices.GetHumans().Cast<Boy>() приведут к исключению.
...
Рейтинг: 0 / 0
Поясните с классами в C#
    #38725333
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, не прав, ТС ведь скрыл реализацию получения IEnumerable<Human> ....
...
Рейтинг: 0 / 0
Поясните с классами в C#
    #38725335
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProДа, не прав, ТС ведь скрыл реализацию получения IEnumerable<Human> ....Ещё раз: 16472684
...
Рейтинг: 0 / 0
Поясните с классами в C#
    #38725338
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAShocker.ProДа, не прав, ТС ведь скрыл реализацию получения IEnumerable<Human> ....Ещё раз: 16472684 имел ввиду, что Я не прав ))
...
Рейтинг: 0 / 0
Поясните с классами в C#
    #38725343
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProskyANAпропущено...
Ещё раз: 16472684 имел ввиду, что Я не прав ))А я имел ввиду, что не важно то, что ТС скрыл реализацию. Не катит это за отмазу
...
Рейтинг: 0 / 0
Поясните с классами в C#
    #38725390
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cheerful CalfПочему во втором случае q всегда null?
потому что в памяти хранятся ссылки на объекты типа Human, а это не Boy

Cheerful Calfи как можно скастить IEnumerable<Human> в IEnumerable<Boy>?
никак, из большой матрешки Boy можно достать меньшую матрешку Human, но не наоборот
если хочешь, чтоб заработало - надо чтоб HumanServices.GetHumans() возвращал Boy
...
Рейтинг: 0 / 0
Поясните с классами в C#
    #38725447
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что-то в этом направлении может быть?
Код: c#
1.
HumanServices.GetHumans().Select(n => new Boy{Id = n.Id, Age = 0})
...
Рейтинг: 0 / 0
Поясните с классами в C#
    #38725679
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попахивает ковариантностью дженериков.

Код: c#
1.
2.
public interface ICovariant<out R> { }
public class CovariantList<R> : List<R>, ICovariant<R> { }



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
public static class HumanServices
{
    public static CovariantList<Boy> GetBoys()
    {
        var list = new CovariantList<Boy>();
        list.AddRange(new[] { new Boy { Id = 1 }, new Boy { Id = 2 }, new Boy { Id = 3 } });
        return list;
    }
}



Код: c#
1.
2.
var boys = HumanServices.GetBoys();
var humans = HumanServices.GetBoys() as ICovariant<Human>;
...
Рейтинг: 0 / 0
Поясните с классами в C#
    #38725808
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ, к чему ты это всё написал?
...
Рейтинг: 0 / 0
Поясните с классами в C#
    #38725844
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAМСУ, к чему ты это всё написал?
К знаниям. А что?
...
Рейтинг: 0 / 0
Поясните с классами в C#
    #38725848
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAМСУ, к чему ты это всё написал?
А именно, как сделать каст IEnumerable<T> as IEnumerable<M>. Именно это написано в начальном вопросе.
...
Рейтинг: 0 / 0
Поясните с классами в C#
    #38725946
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ, ну и как же ТСу сделать каст IEnumerable<Human> as IEnumerable<Boy>?
...
Рейтинг: 0 / 0
Поясните с классами в C#
    #38725949
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может свой конвертер? написать пару строк кода..
Код: c#
1.
2.
3.
4.
 public static IEnumerable<TOut> ConvertTo<TIn, TOut> (this IEnumerable<TIn> enumerable, Func<TIn, TOut> convert)
        {
            return enumerable == null ? null : enumerable.Select(convert);
        }
...
Рейтинг: 0 / 0
Поясните с классами в C#
    #38725977
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей К
Код: c#
1.
var boys = HumanServices.GetHumans().Cast<Boy>();

Ещё один советчик

Вы вообще обратили внимание на то, что Boy - это наследник от Human?Может GetHumans возвращает множество Boy несмотря на то, что имеет тип результата IEnumerable<Human>. Иначе зачем топикстартеру задавать этот вопрос?
...
Рейтинг: 0 / 0
Поясните с классами в C#
    #38726037
Фотография Cheerful Calf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиможет свой конвертер? написать пару строк кода..Да зачем свой? Есть для этого готовое либки (AutoMapper что ли...) как-раз для того чтобы кастить Human в Boy, который унаследован от класса Human (создает объект нужного типа и копирует все подходящие свойства).
МСУПопахивает ковариантностью дженериков.Оооо... Месье... :-) A разве ICovariant<R> есть тоже самое, что и IEnumerable<R> ?
...
Рейтинг: 0 / 0
Поясните с классами в C#
    #38726039
Фотография Cheerful Calf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS: Думал реализация не столь важна, но коль возникли сомнения - то, например, вот (EF):
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public class HumanServices
{
  public IEnumerable<Human> GetHumans()
  {
    return DataContext.DbHumans
      .Select(dbHuman => new Human()
                {
                    Id = dbHuman.Id,
                })
                .OrderBy(x => x.Id);
  }
}
...
Рейтинг: 0 / 0
Поясните с классами в C#
    #38726097
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAпропущено...
Ещё один советчик

Вы вообще обратили внимание на то, что Boy - это наследник от Human?Может GetHumans возвращает множество Boy несмотря на то, что имеет тип результата IEnumerable<Human>. Иначе зачем топикстартеру задавать этот вопрос?Ла-ла-ла-ла-ла-ла.. 16472684
...
Рейтинг: 0 / 0
Поясните с классами в C#
    #38726098
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cheerful CalfPS: Думал реализация не столь важна, но коль возникли сомнения - то, например, вот (EF):
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public class HumanServices
{
  public IEnumerable<Human> GetHumans()
  {
    return DataContext.DbHumans
      .Select(dbHuman => new Human()
                {
                    Id = dbHuman.Id,
                })
                .OrderBy(x => x.Id);
  }
}

Ёбинос, месье, таки что Вы хотите?
...
Рейтинг: 0 / 0
Поясните с классами в C#
    #38726176
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cheerful CalfПочему во втором случае q всегда null? и как можно скастить IEnumerable<Human> в IEnumerable<Boy>?

null ни во что нельзя превратить, null всегда null. и с другой стороны null есть всё, даже под тип КитайскаяБабушка, тоже вполне подходит. филосовский такой вброс.

а вообще

HumanServices.GetHumans().Where(x => x is Boy).ToList();

это спасёт Отца Русской Демократии, но не от null.

уж сорри. месье, же не манж па сис жур.
...
Рейтинг: 0 / 0
Поясните с классами в C#
    #38726177
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAЁбинос, месье, таки что Вы хотите?

"поржать хочу аки конь"
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Поясните с классами в C#
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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