C# - 切换泛型

luf*_*ius 3 c# generics

我试图在泛型方法中的开关上比较泛型类型参数.这对我的解决方案不起作用.原因是:参数必须是特定类型(bool,char,string,integral,enum).

    public T testfunction<T, U>(U numb)
    {
        switch(numb){ //<-- error

        }
        ....
    }
Run Code Online (Sandbox Code Playgroud)

但它背后的意义是什么?如果参数是通用的并且我想进行比较,为什么它必须是类型定义的变量?

Jef*_*itz 6

你想在switch语句中测试什么?当然你必须知道有关正在进入的物体类型的东西.

考虑一下:当您可以在方法中接受Product或Customer类型时,如何构造switch语句?您希望编译器为您做出的逻辑选择是什么?如果希望编译器根据产品价格选择操作,则不适用于Customer对象.但是,如果产品和客户都有一个想要转向的CreateDate字段,则可以将其提取到接口中,并将其用作方法的通用约束.

为您的通用方法签名添加适当的约束,该签名封装了您对所期望的类型的了解,然后您将能够切换:

public interface ICreateDate {

   public DateTime CreateDate { get; set; }

}

 public T testfunction<T, U>(U numb) where U : ICreateDate
    {
        switch(numb.CreateDate.DayOfWeek){

            case DayOfWeek.Monday:

        }
        ....
    }
Run Code Online (Sandbox Code Playgroud)

  • 在这个答案的第一句中提出的观点是,你必须切换一些你知道的关于"麻木"的东西,用它做一个开关. (3认同)
  • 我可能会考虑使用除了`bool`之外的其他东西作为示例切换表达式,因为切换`bool`是表达`if` /`else`的一种相当愚蠢的方式.;) (3认同)