switch
C# はType ではできないので(is
関係によって複数の distinctcase
が適用される可能性があるため、特別なケースとして追加されたわけではないと思います)、これ以外に Type の切り替えをシミュレートするより良い方法はありますか?
void Foo(object o)
{
if (o is A)
{
((A)o).Hop();
}
else if (o is B)
{
((B)o).Skip();
}
else
{
throw new ArgumentException("Unexpected type: " + o.GetType());
}
}
ベストアンサー1
C# 7の場合case
Visual Studio 2017 (リリース 15.*) に同梱されている では、ステートメント (パターン マッチング)で型を使用できます。
switch(shape)
{
case Circle c:
WriteLine($"circle with radius {c.Radius}");
break;
case Rectangle s when (s.Length == s.Height):
WriteLine($"{s.Length} x {s.Height} square");
break;
case Rectangle r:
WriteLine($"{r.Length} x {r.Height} rectangle");
break;
default:
WriteLine("<unknown shape>");
break;
case null:
throw new ArgumentNullException(nameof(shape));
}
C# 6では、switch文をnameof() 演算子(ありがとう @Joey Adams):
switch(o.GetType().Name) {
case nameof(AType):
break;
case nameof(BType):
break;
}
C# 5 以前では、switch ステートメントを使用できましたが、型名を含むマジック文字列を使用する必要があります...これは、特にリファクタリングに適していません (@nukefusion に感謝)
switch(o.GetType().Name) {
case "AType":
break;
}