C# 为什么';当检查类型时,如果显式运算符被重写,是否要考虑运算符?

C# 为什么';当检查类型时,如果显式运算符被重写,是否要考虑运算符?,c#,C#,考虑以下代码示例: public class Human { public string Value { get; set;} } public class Car { public static explicit operator Human (Car c) { Human h = new Human(); h.Value = "Value from Car"; return h; } } public

考虑以下代码示例:

public class Human {    
    public string Value { get; set;}
}
public class Car { 

    public static explicit operator Human (Car c) { 

        Human h = new Human();

        h.Value = "Value from Car";
        return h;
    }
}

public class Program { 
public static void Mani() { 
        Car c = new Car();

        Human h = (Human)c;
        Console.WriteLine("h.Value = {0}", h.Value);
        Console.WriteLine(c is Human);
}
}
我提供了一个从汽车到人类的显式转换的可能性,尽管汽车和人类在等级上是不相关的!上述代码仅表示“汽车可以转换为人”

但是,如果运行代码段,您会发现表达式
c is Human
的计算结果为false!这可能会导致
无效的CastException
。如果操作员试图强制转换,那么强制转换应该成功,因为有一个操作员逻辑应该执行强制转换
什么是“是”测试
是否测试分层“is-a”关系

是否测试变量类型是否可转换为类型

运算符测试实际的类型关系,而不是“can cast”。这是理所当然的


至于“它是如何做到的”部分:我不知道,但我假设有更有效的方法(反射)来测试家庭关系,而不是让它出现异常。

请注意,is运算符只考虑引用转换、装箱转换和取消装箱转换。不考虑其他转换,例如用户定义的转换


作为Henk答案的补充,我想反射应该提供一些方法来检查用户定义的强制转换是否存在。

is操作符从不抛出异常。它与相关的
as
运算符的作用完全相同,只是将结果转换为布尔值。
和as,如果您进行向上转换,则运算符的速度非常快,因为在这种情况下,CLR知道哪些类型是兼容的。如果你投得不好,投得会慢一点

正常强制转换(即
Mytype o2=(Mytype)o1;
)与
as
运算符的作用相同,但可能会引发InvalidCastException

在定义了显式强制转换运算符的情况下,必须使用普通强制转换运算符。

这很有意义:

您正在将汽车对象检查为人类类型。如果它们是相同的或同类的(如果对象继承了人类类型),那么它将返回true

因此,关键字用于检查 对于类型兼容性,通常在 将源类型强制转换(转换)为 目的地类型,以确保 这不会导致类型强制转换异常 被扔掉。使用的是空的 变量始终返回false