首页 > 解决方案 > 为什么在 c# 的同一个命名空间中不能存在两个不同指定的泛型?

问题描述

我正在尝试创建一个函数,该函数要么返回可枚举的第一个元素,要么返回适当的 null 类型。我认为类和结构是不相交的,但这两个函数似乎不能存在于同一个命名空间中。为什么?

static T? TryFirst<T>(IEnumerable<T> b) where T : struct
{
    return b.Any() ? b.First() : new T?();
}
static T TryFirst<T>(IEnumerable<T> b) where T : class
{
    return b.Any() ? b.First() : null;
}

标签: c#generics

解决方案


这是因为编译器将无法区分它们。

您正在使用相同的参数创建相同的函数。
where语句仅说明您可以将哪些泛型类型传递给此函数,但函数定义本身对于编译器仍然相同。

我建议这样做:

static T? TryFirstStruct<T>(IEnumerable<T> b) where T : struct
{
    return b.Any() ? b.First() : new T?();
}

static T TryFirstObject<T>(IEnumerable<T> b) where T : class
{
    return b.Any() ? b.First() : null;
}

此外,如果编译器允许这种行为,那么接下来使用您的代码的程序员将获得两个相同的函数,它们接收和返回相同的东西。

问题是:

  • 你的同事会很困惑。
  • 当您使用var关键字时,它将无法理解将返回给您的值。
  • 您必须自己使用dynamic关键字并检查类型。因此,您将代码增加几倍,减慢方法并使其通常不可读。

推荐阅读