如果 (x 是 A) { // 使用 x 作为 A

本文关键字:使用 作为 如果 | 更新日期: 2023-09-27 18:34:22

在C#中,如果对象是某种类型,我有时必须做一些事情。

例如,

if (x is A)
{
    // do stuff but have to cast using (x as A)
}

如果在if块内,我们可以像使用A一样使用x,因为它不能是其他任何东西,那就太好了!

例如,

if (x is A)
{
    (x as A).foo(); // redundant and verbose
    x.foo();   // A contains a method called foo
}

编译器是否不够聪明,无法知道这一点,或者是否有任何可能的技巧来获得类似的行为

Dlang 能有效地做类似的事情吗?

顺便说一句,我不是在寻找动态。只是尝试编写不那么冗长的代码。显然,我可以做var y = x as A;并使用y而不是X.

如果 (x 是 A) { // 使用 x 作为 A

在 D 中,您通常做的模式是:

if(auto a = cast(A) your_obj) {
    // use a in here, it is now of type A
    // and will correctly check the class type
}

对于一个语句(或可链接调用),可以在 C# 6.0+ 中使用 (x as A)?.Foo(),如 空合并运算符是否存在"相反"?(...用任何语言?

C# 语言中没有多语句版本,因此如果需要,则需要编写自己的语句版本。 即使用 Action 作为if语句的主体:

  void IfIsType<T>(object x, Action<T> action)
  {
     if (x is T)
          action((T)x);
  }
object s = "aaa";
IfIsType<string>(s, x => Console.WriteLine(x.IndexOf("a")));
我相信

这是 C# 7 正在考虑的一个功能。 有关文档,特别是 5.1 类型模式,请参阅 Roslyn 问题:

类型模式对于执行引用类型的运行时类型测试很有用,并替换了习惯用法

var v = expr as Type;
if (v != null) { // code using v }

用稍微简洁一点

if (expr is Type v) { // code using v }`

至于 Dlang,我会在这里参考他们的if statement语法文档。