Существует ли какой-либо 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 3

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 ())