2010-06-02 35 views
1

考虑以下代码示例:
为什么操作员在检查类型时是否考虑了显式操作符是否被覆盖?

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计算结果为假的! I used to believe that the is operator is kinda expensive cause it attempts to do an actual cast可能会导致InvalidCastException。如果操作员正在尝试施放,那么施放应该成功,因为有一个操作员逻辑应该执行施放!
“是”测试是什么?
是否测试分层“is-a”的关系?
是否测试变量类型“是否可以转换为”一个类型?

+0

c是从来没有人型。 – VoodooChild 2010-06-02 09:01:32

回答

3

is运算符测试实际的类型关系,而不是'can cast'。如此。至于“它是如何做到这一点”的一部分:我不知道,但我认为有更有效的方式(反思)来测试家庭关系,而不是让它出现异常。

0

作为除了亨克的答案,我想反映应该提供一些方法来检查用户定义的投是否存在。

0

is运算符从不抛出异常。除了将结果转换为布尔值之外,它与相关的as运算符完全相同。如果您正在进行上传,isas运算符速度非常快,因为此时的CLR知道哪些类型是兼容的。如果你投下阵容的话会慢一点。

正常投射(即Mytype o2 = (Mytype) o1;)与as操作符的操作相同,但可能会引发InvalidCastException。

在你定义了一个显式的演员操作符的情况下,你必须使用普通的演员操作符。

0

它是有道理的:

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

关键字因此用于检查 类型的相容性,通常 之前铸造,以确保 不会导致一种类型强制转换异常 至(变换)一个源类型 目的地类型被抛出。使用空值 变量始终返回false。

this link

相关问题