1. ホーム
  2. c#

[解決済み] c# 7.0: System.Typeをオンにする

2023-07-19 23:21:22

質問

この質問に回答する既存の質問はありません。

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 というチェーンがあり、伝統的なチェーンはいずれにせよコンパイルされるものです。私はこのようなパターンマッチの使用はお勧めしません。