c# - var 关键字并不总是有效?

标签 c# var propertydescriptor

C#,VS 2010。有人,请解释为什么我不能在下面的代码中使用 var!

var props = TypeDescriptor.GetProperties(adapter);

// error CS1061: 'object' does not contain a definition for 'DisplayName'
foreach (var prop in props)
{
    string name = prop.DisplayName;
}

// No error
foreach (PropertyDescriptor prop in props)
{
    string name = prop.DisplayName;
}

TypeDescriptor.GetProperties 返回带有 PropertyDescriptor 实例的 PropertyDescriptorCollection。为什么编译器看不到这个?

最佳答案

TypeDescriptor.GetProperties返回一个只有 GetEnumerator 的类返回非通用 IEnumerator 的实现.其类型 Current 属性是 object - 这是编译器可以推断的唯一类型,所以这就是你的类型 prop变量将是。

第二个foreach使用PropertyDescriptor而不是 var作为 prop 的类型实际上从 object 执行转换至 PropertyDescriptor .

假设这段代码:

PropertyDescriptor x = // get from somewhere;
object o = x;
PropertyDescriptor y = (PropertyDescriptor)o;

同样的事情发生在第二个foreach循环每个项目。


您可以添加 Cast<PropertyDescriptor>()获得通用 IEnumerable<T>实现 GetEnumerator返回 IEnumerator<T> .如果这样做,您可以使用 varforeach循环:

var props = TypeDescriptor.GetProperties(adapter).Cast<PropertyDescriptor>();

// No error
foreach (var prop in props)
{
    string name = prop.DisplayName;
}

关于c# - var 关键字并不总是有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14874072/

相关文章:

c# - Aspnet5 RC1在IIS中调试

c# - 我如何确定 C# 字典的当前容量?

javascript - 在函数中使用 let 而不是 var 的优点

ios - Swift 中的@IBOutlet 变量

c# - INotifyPropertyChange 事件和自定义 PropertyDescriptor

c# - AES - c# 加密和 objective-c 解密不起作用

c# - 如何比较linq中2个列表中子项的属性

javascript - 在 JavaScript 函数中从 SQL 查询检索变量(重写)

JavaScript:属性描述符在传递给函数时被忽略

c# - 如何在PropertyGrid中编辑根行中的可扩展对象?