通用NOT约束,其中T:!IEnumerable

Cel*_*Cel 48 .net c# generics ienumerable

根据标题,是否可以在c#4中声明类型否定约束?

Jon*_*eet 44

不 - 在C#或CLR中都没有这样的概念.

  • 请添加与该答案对应的最新 C# 版本...以防将来必须更改... (4认同)
  • @JonSkeet:重新访问旧答案是不可行的,这是您“应该”在回答时指定当前版本的一个重要原因。如果你说“从版本 X 开始”,那么即使版本 Y 中发生了某些变化,你的答案在技术上仍然是正确的。更重要的是,十年后阅读本文的人会注意到旧版本号,并且不会将答案视为福音。 (3认同)
  • @Serge:我宁可不这样做.它几乎适用于网站上基于语言的问题的每一个答案,每次有新版本的C#重新访问每个答案都是不可行的. (2认同)
  • @TravisReed:说实话,我认为这会给很多答案增加很多噪音。请注意,该问题已经指定了 C# 的版本,人们“应该”查看上下文答案的日期(IMO)。 (2认同)

Ric*_*nte 7

我发现自己正在尝试实施评论中提到的相同案例

void doIt<T>(IEnumerable<T> what) { }
void doIt<T>(T whats) { }
Run Code Online (Sandbox Code Playgroud)

排除了以下代码以引用第一种方法

doIt(new List<T>());
Run Code Online (Sandbox Code Playgroud)

但它实际上引用了第二个

一个解决方案是的说法是这样的:

doIt(new List<T>().AsEnumerable<T>());
Run Code Online (Sandbox Code Playgroud)

演员表可能会被另一个重载隐藏:

void doIt<T>(List<T> whats) {
    doIt(whats.AsEnumerable<T>());
}
Run Code Online (Sandbox Code Playgroud)


Did*_*hys 5

据我所知,这是不可能的。

你可以做的是一些运行时检查:

public bool MyGenericMethod<T>()
{
    // if (T is IEnumerable) // don't do this

    if (typeof(T).GetInterface("IEnumerable") == null)
        return false;

    // ...

    return true;
}
Run Code Online (Sandbox Code Playgroud)

  • 你的意思是`if (typeof(T) == typeof(IEnumerable)) {}` (4认同)
  • 你不能像那样使用 `is` - 它测试 *object* 是否与类型兼容。 (3认同)