【问题标题】:implicit operator List<Employee>(Company value)?隐式运算符 List<Employee>(公司价值)?
【发布时间】:2015-12-24 02:01:13
【问题描述】:

我正在尝试找到一种方法让我的 foreach 循环看起来更干净一些。

假设我有一个“公司”课程。此类包含多个列表,例如 List Employees 和 List Managers。

然后,在我的代码中的某处,我想遍历这些列表。

我可以写:

foreach (Employee in company.Employees) {}
foreach (Manager in company.Managers) {}

但我认为简单地说:

foreach (Employee in company) {}
foreach (Manager in company) {}

但它不允许我这样做。所以我尝试为公司创建一个简单的隐式转换,例如:

static public implicit operator List<Employee>(Company value)
{
    return value.Employees;
}
static public implicit operator List<Manager>(Company value)
{
    return value.Managers;
}

...令人惊讶的是,这没有给出任何错误,至少在这些行上没有。

但在 foreach 语句中,它给出了错误:CS1579 foreach 语句无法对“Company”类型的变量进行操作,因为“Company”不包含“GetEnumerator”的公共定义。

有没有一种简单的方法可以做到这一点,例如隐式运算符?如果没有,谁能解释为什么这样做必须如此复杂?

【问题讨论】:

  • 如果我是你,我会远离隐式转换。它们很少使代码更具可读性、可维护性等,而且很容易出错。
  • foreach (Employee in (List&lt;Employee&gt;) company) {}; 我认为这会起作用,但正如@sstan 所说,尽量避免隐式转换:)。干杯。
  • 你说可以写foreach (Employee in company.Employees) { }。不,你不能 - 这是一个语法错误。

标签: c# list ienumerable implicit-conversion


【解决方案1】:

我认为你做不到。 在您概述的代码中,class Employeeclass Manager 是不同的类型,因此似乎有足够的信息来推断隐式转换。

但要认识到它们都派生自class Object,并且可能共享其他类,例如class Person。那么这些表达式会在哪里留下呢?

foreach(Object o in company) ...
foreach(Person p in company) ...

在这些情况下,您想要的隐式转换(到 EmployeesManagers)是模棱两可且无法解析的。

这就是为什么您的建议无法完成的原因:因为它无法在所有情况下都有效。

【讨论】:

  • 我希望 c# 足够聪明,如果我的 foreach 循环是“foreach(公司中的员工)”,则应该使用我的“List(公司值)”的隐式运算符“......因为它显然知道我正在尝试遍历“Employee”,因此它会搜索或隐式运算符,并在“List”中找到一个,然后选择它......
  • 我明白了...但是我的问题是当您尝试循环遍历Object 时,应该使用哪个隐式运算符? Employee 和 Manager 运算符都符合条件。
  • 好吧,如果我说(员工是员工),结果是真的。但是如果我说(new System.Object() is Employee),结果是假的......所以我不明白为什么我无法弄清楚我对 List 有隐式转换,但对 List 没有.
猜你喜欢
  • 1970-01-01
  • 2015-10-24
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-27
  • 1970-01-01
  • 2021-03-24
相关资源
最近更新 更多