我已经为对象开发了一些扩展方法,我不想在实现 IEnumerable 的对象的智能感知中使用/显示这些方法。从概念上讲,我想要如下所示的东西

public static T SomeMethod<T>(this object value) where T != IEnumerable
        {

        }

是否有可能在 C# 中施加这种约束?

编辑

抱歉,我以错误的方式提出了问题。我知道 C# 中允许的约束,我想知道是否有其他方法可以实现这一点?

有帮助吗?

解决方案

只是为了确认 Øyvind 的评论:C# 中没有这样的约束。唯一的约束类型是:

  • where T : struct (不可空值类型约束)
  • where T : class (引用类型约束)
  • where T : SomeClassName (转换为特定类约束)
  • where T : ISomeInterfaceName (转换为特定的接口约束)
  • where T : U (转换为另一种类型参数约束)
  • where T : new() (无参数构造函数约束)

请注意,我只分离出了特定的类和接口约束,因为前者是主要约束,后者是次要约束。

其他提示

这是不受支持的。法律约束列出 rel="nofollow">这里。

这是不可能的。

正如其他人提到你想要做的是行不通的,但是,你可以看看你想支持,并限制一些类/接口,它们的共同点,是什么类型的对象,或者你可能只是需要沟通用部分和写几篇扩展方法,这样你就可以禁止的IEnumerable

您不能,我同意这是一个麻烦事,但我已经找到了自己想要与其说是你在找什么,作为压倒一切的约束(的基础上,这样我可以具有例如类和相同的方法或类,以及一个结构版本具有用作适用适当的一个)。

有两种情况下,我们可以顺利拿到。

一个是我们的原因不希望使用的扩展方法是,它已经作为一个实例方法提供。事实上,我们得到这个免费的;实例方法总是用来代替扩展方法(尽管当调用derivedClass.method()如果它仅在baseClass.method()存在derivedClass不会”被使用)。

在另一种情况是运行时的选择:

public static T SomeMethod<T>(this object value) where T != IEnumerable
{
  if(typeof(T).GetInterface("IEnumerable") != null)
  {
    //behaviour appropriate for IEnumerable
  }
  else
  {
    //other behaviour.
  }
}

这不是理想的,尤其是如果只有“行为适合的IEnumerable”的是抛出一个异常,但它有时是不够的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top