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

时间:2016-08-19 13:55:01

标签: c# types lambda intellisense

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

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

无论如何它说它找不到t是什么(t的第二个实例)。它在lambda函数中使用之前已经非常明确地定义了,并且将鼠标悬停在它的第一个实例 Intellisense 上甚至告诉我它是(参数) Type t

对此非常困惑,因为我不知道为什么VS无法解决这个问题。偶尔 Intellisense 会起作用并重新启动VS会修复它,但不是这次。

(顺便说一句,这是VS2013)

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

2 个答案:

答案 0 :(得分:3)

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

从您的代码中,我想您要做的是检查某个对象是否是由其System.Type表示的某种类型的实例。在这种情况下,您需要使用类型<{p>的IsInstanceOfType method

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

答案 1 :(得分:0)

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));