Существует ли какой-либо c# аналог C++ std:: is same class template?
В C++ кто-то может написать следующий фрагмент кода:
#include <type_traits>
template <typename Type1, typename Type2>
bool TestArgumentTypesOnEquality(Type1 argument1, Type2 argument2)
{
return std::is_same<Type1, Type2>::value;
}
std::is_same
шаблон класса проверяет, равны ли Type1
и Type2
(которые являются типами аргументов шаблона функции TestArgumentTypesOnEquality
).
Существует ли какой-либо аналог c# generics этой функциональности стандартной библиотеки C++?
public static bool TestArgumentTypesOnEquality<Type1, Type2>(Type1 argument1, Type2 argument2)
{
return /* ??? */;
}
Конечно, существуют только простые тестовые образцы. Реальный код сложнее. На самом деле я только хочу знать, можно ли проверить два универсальных параметра типа на равенство в C#.3 ответа:
В C# не так много функций времени компиляции, таких как шаблоны, макросы,
static_assert
. C# generics-это почти среда выполнения. Шаблоны C++ - это абсолютное время компиляции. Механизм определения типа времени компилятора, напримерstd::is_same
,std::enable_if
не будет работать в C#.
Вы можете принимать решения, основываясь на объектах отражения:
if (typeof(Type1) == typeof(Type2)) ...
Обычно универсальный код предназначен для того, чтобы не знать и не заботиться ни о чем конкретном о типах. Конечно, вы можете отступить от этого правила, если обстоятельства того требуют.
Я не знаком с C++, но в C# есть два типа равенства-объектное (ссылочное) равенство и равенство значений. Равенство значений проверяет базовое значение свойств структуры, а равенство ссылок проверяет "указатель" ссылочного типа, чтобы увидеть, указывают ли они на одну и ту же ссылку на объект.
Чтобы проверить, являются ли два объекта одним и тем же типом (но не одной и той же ссылкой или одним и тем же значением), используйте Assert(object1.GetType () = = object2.GetType ())