如何使用Type Constraint创建实现两个接口的Generic Collection?

sia*_*mak 1 c# generics syntax

对不起我在c#中没有处理泛型

根据这个问题,如何制作一个实现两个接口的generc集合我正在寻找这样的直接方式:当然它会产生错误并且完全是错误的.

interface IEmployee {void DisplayInfo();}

interface ISalary {void CalculateSalary();}


class Nurse : IEmployee, ISalary
{
 //some Implementation
}


class Doctor : IEmployee, ISalary
{
 //some Implementation
}

class EntryPoint
{
 static void Main(string[] args)
  { 
  System.Collections.Generic .List<T>  employees where T: ISalary,IEmployee
   =new System.Collections.Generic .List<T>();
  }

 Nurse oNurse = new Nurse();
 Doctor oDoctor = new Doctor();

 employees.Add(oNurse);
 employees.Add(oDoctor);
}
Run Code Online (Sandbox Code Playgroud)

经过一些阅读后,我发现可能我必须首先定义这样的泛型类:

public class HospitalEmployee<T> where T : IEmployee, ISalary
Run Code Online (Sandbox Code Playgroud)

{

}

不幸的是,它很有用,现在我很困惑,不知道该怎么做,请帮助,谢谢你

Eri*_*ert 14

你可以这样做:

interface IEmployee { void DisplayInfo(); }
interface ISalaried { void CalculateSalary(); }
interface ISalariedEmployee : IEmployee, ISalaried {}
class Doctor : ISalariedEmployee { whatever }
class Nurse : ISalariedEmployee { whatever }
...
var list = new List<ISalariedEmployee>() { new Nurse(), new Doctor() };
Run Code Online (Sandbox Code Playgroud)

这有帮助吗?

基本上你真正想要的功能不存在.有一种方法可以说" 这个泛型类型参数必须使用实现这两个接口的类型参数构造 "但奇怪的是,没有办法说" 必须通过引用一个对象来初始化这个局部变量 " 实现这两个接口 ".这只是C#类型系统的一个缺点,您可以在类型参数中表示但不能在本地中表示.你想要的是:

var list = new List<IEmployee + ISalary>();
Run Code Online (Sandbox Code Playgroud)

现在,您只能将事物放入实现两个接口的列表中.但不幸的是,C#中没有这样的功能.抱歉!

  • @siamak:詹姆斯开个玩笑.C#不支持这些功能.像F#或Haskell这样的功能语言在其类型系统中具有这些功能. (2认同)