C# 泛型约束:接口或接口数组

问题描述 投票:0回答:1

我试图了解如何在我的用例中使用约束。这是伪代码:

public interface IEmployee
{
    string Name { get; }
    int Id { get; }
}

public class Processor<T> where T : IEmployee
{
    public T Process()
    {
      ...
    }
}

现在我有一个新的用例,我可以返回一个

IEmployee
数组,据我所知,无法将其指定为约束:

一个快速修复方法是简单地注释掉原始的通用约束并具有:

public class Processor<T> /*where T : IEmployee */

我想知道是否有其他替代解决方案要求程序员在 IEmployee[] 数组类型的情况下传递正确的类型(我的接口的实现)。


更新。最后两种语法都应该编译:

public record Employee(string Name, int Id) : IEmployee;
public class Processor1 : Processor<Employee> {...}
public class Processor2 : Processor<Employee[]> {...}

更新2:我的问题是不是关于重写现有框架或更改API。我只需要表达一个约束,这样当程序员没有返回正确的类型时,我就会遇到编译时失败。

如何表达这样的编译时间限制?

c# generics interface
1个回答
0
投票
public record Employee(string Name, int Id) : IEmployee;
public class Processor1 : Processor<Employee> {...}
public class Processor2 : Processor<Employee[]> {...}

没有办法在保持限制的情况下使这两者都起作用。一个项目与所述项目的集合不同。

有几种可能的替代方案:

  1. 将方法签名更改为
    T[] Process()
    。单个员工的情况可以通过创建一个包含一名员工的数组来处理。
  2. 将限制更改为
    where T : IEnumerable<IEmployee>
    。这将使
    class Processor2 : Processor<Employee[]>
    正常工作。您需要将类型限制为只读集合接口,以防止有人尝试将其他员工类型添加到数组中。
  3. 为“返回很多”场景创建一个不同的类。 “返回数组”用例可能比您想象的更不同,并且使用不同的类来处理不同的用例可能是合适的。

很难从给定的上下文中判断哪个选项最合适。

© www.soinside.com 2019 - 2024. All rights reserved.