在明确定义 t 的 lambda 中找不到类型或命名空间 't'

Type or Namespace 't' could not be found in lambda clearly defining t

public static bool Is(this object o, IEnumerable<Type> types)
{
    return types.Any(t => o is t);
}

这是一种简单的扩展方法,用于测试对象是否是提供的类型之一 - 用于提高代码的可读性。

无论如何,它说找不到 t 是什么(t 的第二个实例)。它在 lambda 函数中使用之前定义得非常清楚,将鼠标悬停在它的第一个实例上 Intellisense 甚至告诉我它是 (parameter) Type t.

对此很困惑,因为我不知道为什么 VS 无法弄清楚。偶尔 Intellisense 会出现问题,重新启动 VS 会修复它,但这次不会。

(顺便说一句,这是 VS2013)

编辑:我不同意这是重复的。这个问题来自一个完全不同的角度,并且有一个不同的公认答案。

问题在于 is 运算符需要左侧为对象,右侧为 类型名称。文字类型 name,不是 class System.Type 的实例。

从你的代码来看,我猜想你想做的是检查某个对象是否是由其 System.Type 表示的某种类型的实例。在这种情况下,您需要使用 class 类型

IsInstanceOfType method
return types.Any(t => t.IsInstanceOfType(o));

o is t 的问题是 t 需要是一个类型而不是一个持有类型的变量。相反,您可以这样做:

return types.Any(t => o.GetType() == t);

或者:

return types.Any(t => t.IsInstanceOfType(o));

这将确保类型完全匹配。如果您关心从其他类型继承的类型,那么这更准确:

return types.Any(t => o.GetType().IsAssignableFrom(t));