繁体   English   中英

编译器如何确定是否可以将类型强制转换为其他类型

[英]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的引用,我可以安全地强制转换为DA (或object )。 编译器可以告诉大家,如果我尝试投ECB没有转化为可用的,因为E没有从这些2继承,但他们都有一个共同的基类的A

现在,考虑我是否引用A并尝试转换为E 如果所讨论的实例实际上不是E的实例(例如,可以是'A,B,C,D或E'中的任何一个),则此检查不能在编译时执行,并且将在运行时失败。

除此之外,正如Silvermind指出的,我们可以提供不存在的implicitexplicit转换。 考虑一下:

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;

没有我们的隐式运算符,这将(显然)在编译时失败,因为默认情况下不存在从Personstring的转换。

显式运算符相似,但工作方式相反。 如果我们想将字符串转换为一个人,则会发生这种情况。 因此,我们可以添加以下显式运算符:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM