有没有C#类似于C++ std::is_same类模板的东西?

3
在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类模板检查Type1Type2(它们是TestArgumentTypesOnEquality函数模板参数的类型)是否相等。

是否有C#泛型的类似功能来实现这个C++标准库的功能呢?

public static bool TestArgumentTypesOnEquality<Type1, Type2>(Type1 argument1, Type2 argument2)
{
    return /* ??? */;
}

当然,这里只有简单的测试样本。实际代码更加复杂。事实上,我只想知道在 C# 中是否有可能测试两个泛型类型参数的相等性。

泛型不是模板。因此它们在编译时不会被更改。而且我不确定你想要我提到的内容还是argument1.GetType()== argument2.GetType(),区别在于调用TestArgumentTypesOnEquality(1,(object)2)将为GetType返回true,但对于typeof则为false。 - juharr
@juharr 是的,我明白了。我想要的正是你提到的。但是…遗憾的是没有编译时机制。泛型本身就是编译时机制的一个例子,不是吗? - Constructor
你实际上想要达到什么目的? if (typeof(Type1) == typeof(Type2)) ... 有什么问题吗? - usr
@juharr 好的。谢谢您提供的链接。 - Constructor
@usr 实际上没有任何问题。 - Constructor
显示剩余3条评论
3个回答

5

C# 缺少许多编译时功能,例如模板、宏、static_assert。C# 泛型几乎都是在运行时实现的。而 C++ 模板则完全是在编译期间实现的。类似于 std::is_samestd::enable_if 的编译器时间类型确定机制在 C# 中不起作用。


1
你可以根据反射对象做出决策:
if (typeof(Type1) == typeof(Type2)) ...

通常来说,通用代码的设计是不考虑具体类型相关信息的。当然,如果情况需要,你可以违反这个规则。


0

我不熟悉C++,但在C#中有两种相等类型 - 对象(引用)相等和值相等。值相等检查结构体属性的基础值,引用相等检查引用类型的“指针”,以查看它们是否指向相同的对象引用。

要检查两个对象是否为相同类型(但不是相同引用或相同值),请使用Assert(object1.GetType() == object2.GetType())


你不能将对象传递给 typeof,只能传递类型名称和泛型类型参数。如果你有对象,那么你需要使用 object1.GetType() == object2.GetType() - juharr
糟糕 - 发现得好,纠正得好。可恶我的匆忙打字。 - PhillipH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接