C# 什么在阻止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) {
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;老实说,我不知道该如何清理这片混乱。无论如何,非常感谢你的评论。