是否有 C++ std::is_same class 模板的 C# 类似物?
Is there any C# analogue of 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
class 模板检查 Type1
和 Type2
(TestArgumentTypesOnEquality
函数模板参数的类型)是否相等。
是否有此 C++ 标准库功能的任何 C# 泛型模拟?
public static bool TestArgumentTypesOnEquality<Type1, Type2>(Type1 argument1, Type2 argument2)
{
return /* ??? */;
}
当然只有简单的测试样本。实际代码更复杂。事实上,我只想知道是否可以在 C# 中测试两个泛型类型参数是否相等。
我不熟悉 C++,但 C# 中有两种类型的相等性 - 对象(引用)相等性和值相等性。值相等性检查结构属性的基础值,引用相等性检查引用类型的 "pointer" 以查看它们是否指向相同的对象引用。
要检查两个对象是否具有相同的类型(但不是相同的引用或相同的值),请使用 Assert(object1.GetType() == object2.GetType())
C# 没有很多编译时特性,例如模板、宏,static_assert
。 C# 泛型几乎是运行时的。 C++ 模板绝对是编译时间。 std::is_same
、std::enable_if
等编译器时间类型确定机制在 C# 中不起作用。
您可以根据反射对象做出决定:
if (typeof(Type1) == typeof(Type2)) ...
通常,泛型代码意味着不知道也不关心有关类型的任何具体内容。当然,如果情况允许,您可以偏离该规则。
在 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
class 模板检查 Type1
和 Type2
(TestArgumentTypesOnEquality
函数模板参数的类型)是否相等。
是否有此 C++ 标准库功能的任何 C# 泛型模拟?
public static bool TestArgumentTypesOnEquality<Type1, Type2>(Type1 argument1, Type2 argument2)
{
return /* ??? */;
}
当然只有简单的测试样本。实际代码更复杂。事实上,我只想知道是否可以在 C# 中测试两个泛型类型参数是否相等。
我不熟悉 C++,但 C# 中有两种类型的相等性 - 对象(引用)相等性和值相等性。值相等性检查结构属性的基础值,引用相等性检查引用类型的 "pointer" 以查看它们是否指向相同的对象引用。
要检查两个对象是否具有相同的类型(但不是相同的引用或相同的值),请使用 Assert(object1.GetType() == object2.GetType())
C# 没有很多编译时特性,例如模板、宏,static_assert
。 C# 泛型几乎是运行时的。 C++ 模板绝对是编译时间。 std::is_same
、std::enable_if
等编译器时间类型确定机制在 C# 中不起作用。
您可以根据反射对象做出决定:
if (typeof(Type1) == typeof(Type2)) ...
通常,泛型代码意味着不知道也不关心有关类型的任何具体内容。当然,如果情况允许,您可以偏离该规则。