如果 (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
.
在 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
语法文档。