c# 7.0 : switch on System. 类型

标签 c#

没有现有问题可以回答这个问题。

在 c# 7 中,我可以直接在 System.Type 上切换吗?

当我尝试时:

    switch (Type)
    {
      case typeof(int):
        break;
    }

它告诉我 typeof(int) 需要是一个常量表达式。

是否有一些语法糖可以让我避免 case nameof(int): 并直接比较类型是否相等? nameof(T) 在 case 语句中并不完全好,因为命名空间。因此,尽管名称冲突可能不适用于 int,但它将适用于其他比较。

换句话说,我正在尝试比这更类型安全:

    switch (Type.Name)
    {
      case nameof(Int32):
      case nameof(Decimal):
        this.value = Math.Max(Math.Min(0, Maximum), Minimum); // enforce minimum 
        break;
    }

最佳答案

(已链接的)新模式匹配功能允许这样做。

通常,您会打开一个值:

switch (this.value) {
  case int intValue:
    this.value = Math.Max(Math.Min(intValue, Maximum), Minimum);
    break;
  case decimal decimalValue:
    this.value = Math.Max(Math.Min(decimalValue, Maximum), Minimum);
    break;
}

但是你可以用它来打开一个类型,如果你只有一个类型的话:

switch (type) {
  case Type intType when intType == typeof(int):
  case Type decimalType when decimalType == typeof(decimal):
    this.value = Math.Max(Math.Min(this.value, Maximum), Minimum);
    break;
}

请注意,这不是该功能的目的,它比传统的 if...else if...else if 可读性差...else 链,而传统链就是它编译的结果。我不建议使用这样的模式匹配。

关于c# 7.0 : switch on System. 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43080505/

相关文章:

c# - Xamarin IOS 基于自定义渲染器中的 IsFocused 属性隐藏搜索栏图标

c# - 实际上什么是Nothing——它是如何转换的

c# - 即使在 WPF 中提供 CommandParameter 后按钮也未启用

c# - WPF DatePicker Watermark 使用了错误的语言,但 Dateformat 是正确的

c# - 用于控制台应用程序的 spring .net nhibernate session 管理

c# - .NET 4.0 和 C# 4.0 中的事件和委托(delegate)逆变

c# - MVC 4's mapRoute URL -- {controller}/{action} vs Controller/{action}. What' 的区别?

c# - 如果运算符 (? :) in C#?

c# - WebSocketSharp 找不到具有指定路径的 WebSocket 服务

c# - 如何在 TcpClient 中正确使用 TPL?