C# 什么在阻止C编译器实现';开关';关于'的声明;键入';?

C# 什么在阻止C编译器实现';开关';关于'的声明;键入';?,c#,.net,compiler-optimization,C#,.net,Compiler Optimization,我知道C#编译器目前不允许像这样打开类型 switch (typeof(MyObj)) case Type1: case Type2: case Type3: 有一些解决方案可以使用类型和动作的字典或静态类(),但我只是好奇,为什么这是一种糟糕的做法,或者还没有在编译器中实现 提前谢谢。如果您谈论的是基本类型,您可以切换到TypeCode var typeCode = Type.GetTypeCode(type); switch (typeCode) {

我知道C#编译器目前不允许像这样打开类型

switch (typeof(MyObj))
    case Type1:
    case Type2:
    case Type3:
有一些解决方案可以使用类型和动作的字典或静态类(),但我只是好奇,为什么这是一种糟糕的做法,或者还没有在编译器中实现


提前谢谢。

如果您谈论的是基本类型,您可以切换到
TypeCode

var typeCode = Type.GetTypeCode(type);    
switch (typeCode)
{
    case TypeCode.Empty:
        break;
    case TypeCode.Object:
        break;
    case TypeCode.DBNull:
        break;
    case TypeCode.Boolean:
        break;
    case TypeCode.Char:
        break;
    case TypeCode.SByte:
        break;
    case TypeCode.Byte:
        break;
    case TypeCode.Int16:
        break;
    case TypeCode.UInt16:
        break;
    case TypeCode.Int32:
        break;
    case TypeCode.UInt32:
        break;
    case TypeCode.Int64:
        break;
    case TypeCode.UInt64:
        break;
    case TypeCode.Single:
        break;
    case TypeCode.Double:
        break;
    case TypeCode.Decimal:
        break;
    case TypeCode.DateTime:
        break;
    case TypeCode.String:
        break;
}

顺便说一句,对于您的问题,您可能需要阅读

我建议您参考以下公认的答案:。编译器需要在编译时知道不会有任何重复项,因此它只接受常量。顺便说一句,你可以用它来达到同样的效果

switch (typeof(MyObj).FullName 
并使用每种类型的名称作为案例条件,如:

case "MyNamespace.Type1":
   /*stuff*/
   break;
case "MyNamespace.Type2":
   /*other stuff*/
   break;
default:
   /*default stuff*/

你什么时候会使用开机类型?我能想到的大多数情况都是通过继承来更好地解决的,即,而不是:

switch (typeof(MyObj)) {
    case Type1: doSomethingForType1; break;
    case Type2: doSomethingForType2; break;
    case Type3: doSomethingForType3; break;
您将以更面向对象的方式进行设置:

Interface ISpecialType {
    void doSomething();
}
Type1 : ISpecialType {
    doSomething() {}
}
Type2 : ISpecialType {
    doSomething() {}
}
Type3 : ISpecialType {
    doSomething() {}
}
然后,不管怎样,只要调用
MyObj.doSomething()刚开始的时候输入要多一些,但要健壮得多


此外,如果开启对您来说非常重要,您可以始终使用typeof(MyObj).toString()并开启它。这不是推荐的做法,因为您正在硬编码允许更改为开关的字符串,但您可以这样做。

相关问题:类型肯定在编译时得到评估。它们在编译时进行分析,但它们不是编译时常量。它们在运行时被重新绑定。我不知道在thanksI能够理解您的意思之前,Scott和我非常同意,我正在尝试重构遗留代码,其中在父级抛出并捕获了不同的异常,然后用于发送相应的错误消息。我发现了很多:if(比如XmlSchemaValidationException)errorCode=ServiceExceptionErrorCode.XmlSchemaValidation;否则,如果(ex为BadRequestException)errorCode=ServiceExceptionErrorCode.BadRequest;老实说,我不知道该如何清理这片混乱。无论如何,非常感谢你的评论。