下面的答案是几年前写的,并且随着时间的推移而更新。从C#7开始,您可以使用模式匹配:
if (animal is Dog dog)
{
    // Use dog here
}
请注意,dog该if语句之后仍在范围内,但未明确分配。
不,没有。虽然这样写更惯用:
Dog dog = animal as Dog;
if (dog != null)
{
    // Use dog
}
鉴于“ as if后面的”几乎总是以此方式使用,因此可能需要一个操作员一次性执行两个部分的操作。如果实施了模式匹配建议,则C#6中当前不存在此功能,但C#7中可能包含此功能。
问题是您不能在语句1的条件部分中声明变量。我能想到的最接近的方法是:if
// EVIL EVIL EVIL. DO NOT USE.
for (Dog dog = animal as Dog; dog != null; dog = null)
{
    ...
}
那太讨厌了 ……(我已经尝试过了,它确实起作用了。但是请,请不要这样做。哦,您当然可以声明dog使用var。)
当然,您可以编写一个扩展方法:
public static void AsIf<T>(this object value, Action<T> action) where T : class
{
    T t = value as T;
    if (t != null)
    {
        action(t);
    }
}
然后调用:
animal.AsIf<Dog>(dog => {
    // Use dog in here
});
另外,您可以将两者结合起来:
public static void AsIf<T>(this object value, Action<T> action) where T : class
{
    // EVIL EVIL EVIL
    for (var t = value as T; t != null; t = null)
    {
        action(t);
    }
}
与for循环相比,您还可以使用没有lambda表达式的扩展方法:
public static IEnumerable<T> AsOrEmpty(this object value)
{
    T t = value as T;
    if (t != null)
    {
        yield return t;
    }
}
然后:
foreach (Dog dog in animal.AsOrEmpty<Dog>())
{
    // use dog
}
1您可以在语句中分配值if,尽管我很少这样做。但是,这与声明变量不同。这不是非常不寻常的,我做在while读取数据流时,虽然。例如:
string line;
while ((line = reader.ReadLine()) != null)
{
    ...
}
如今,我通常更喜欢使用可以使用的包装器,foreach (string line in ...)但我将以上内容视为一种惯用的模式。这通常不是很好,有一个条件中的副作用,但替代品通常涉及重复代码,当你知道这种模式很容易得到的权利。
               
              
bool情况?