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
从