гарантирует ли GetType() приведение?

#c#

#c#

Вопрос:

если o.GetType() == sometype гарантируется, что o может быть приведено к sometype ?

то есть, если:

 void f<T>(T o1, object o2) {
   if (o1.GetType() != o2.GetType()) return;
   T t = o2 as T;
   // can I assert that t is not null ??
}
  

Комментарии:

1. Это похоже на проблему XY, или, по крайней мере, здесь чувствуется запах кода…

2. Да, это гарантировано, но этот код не имеет большого смысла как есть

3. Если быть точным, ваш код нарушает это: en.wikipedia.org/wiki/Liskov_substitution_principle

4. Очевидно, что это не сработает для типов значений. Обычное приведение было бы прекрасно

5. Нет гарантии, что T и o1.GetType() будут одного и того же типа ( T могли бы быть object , например, в то время как GetType() возвращался бы реальный тип). Я не говорю, что это проблема, просто указываю на это на случай, если это повлияет на ваше решение.

Ответ №1:

Да, вы можете, но я бы предложил пойти еще дальше и сделать это:

 void f<T, U>(T t, U u) where T : class
{
    if (!t.GetType().IsAssignableFrom(u.GetType())) return;
    T ut = u as T;
    // can I assert that t is not null ?? Yes, you can
}
  

IsAssignableFrom следует использовать его для любого типа.

Ответ №2:

Почему бы просто не использовать is оператор, 1, хотя «возможно» немного медленнее

 if (o2 is SomeType result) o1 = resu<
  

или как метод

 private void SomeThingWeird<T>(ref T o1, object o2)
{
   if (o2 is T result)
      o1 = resu<
}
  

Ссылки

Детализация .Микробные метки среды выполнения NET: оптимизация ‘typeof’ 1.

Комментарии:

1. @Enigmativity возможно, ошибочно предположил, что это метод swappsies, и OP хотел, чтобы результат отражался обратно вызывающему

2. Читая комментарии, я вижу, что делает расширенный метод, поэтому в них произошла ошибка (снова)

Ответ №3:

Почему бы не выполнить :

 void f<T>(T o1, T o2) {
   if (o1.GetType() != o2.GetType()) return;
   // can I assert that t is not null ??
}
  

Насколько я понимаю, вы хотите, проверив, if (o1.GetType() != o2.GetType()) return; чтобы убедиться, что это o2 тип T , а не производный тип. Так что o2 должно быть типа T , и у вас не возникнет никаких проблем с приведением.