[英]How does compiler decide if a Type can be cast to another type
上周,我处理了一些对象强制转换(DataGridView Columns Control强制转换),并且尝试将DataGridView TextBox Column强制转换为TextBox控件,其中发生了编译时错误。
我发现应该将TextBox Column强制转换为DataGridViewTextBoxColumn。
那么,编译器如何确定一个类型是否可以强制转换为另一个类型(主要是对象)?
接下来,您会遇到一些情况,编译器允许您进行一些强制转换,但会遇到运行时错误。
所有类和类型都从object
继承。 除此之外,还取决于另一个类从哪个类派生。 使用此功能,编译器可以确定是否可以将某些内容从一个对象投射到另一个对象。 这些检查中的一些可以在编译时确定,而另一些可以在运行时确定。
考虑:
class A
class B
class C
class D
class E
现在,提供对E
的引用,我可以安全地强制转换为D
或A
(或object
)。 编译器可以告诉大家,如果我尝试投E
到C
或B
没有转化为可用的,因为E
没有从这些2继承,但他们都有一个共同的基类的A
。
现在,考虑我是否引用A
并尝试转换为E
如果所讨论的实例实际上不是E
的实例(例如,可以是'A,B,C,D或E'中的任何一个),则此检查不能在编译时执行,并且将在运行时失败。
除此之外,正如Silvermind指出的,我们可以提供不存在的implicit
和explicit
转换。 考虑一下:
public class Person
{
private string name_;
public Person(string name)
{
name_ = name;
}
// allow conversion to a string
public static implicit operator string(Person p)
{
return p.name_;
}
}
以上内容使我们可以:
Person p = new Person("Moo-Juice");
string name = (string)p;
没有我们的隐式运算符,这将(显然)在编译时失败,因为默认情况下不存在从Person
到string
的转换。
显式运算符相似,但工作方式相反。 如果我们想将字符串转换为一个人,则会发生这种情况。 因此,我们可以添加以下显式运算符:
public static explicit operator Person(string name)
{
return new Person(name);
}
现在我们可以这样做:
string name = "Moo-Juice";
Person p = (Person)name;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.