引用类型

时间:2016-11-02 02:34:35

标签: c# casting

我有以下代码使用显式转换a = (Class2)o

using System;

class Class1 { }
class Class2 : Class1{ }

class IsTest
{
    static void Test(object o)
    {
        Class1 a;
        Class2 b;

        if (o is Class2)
        {
            Console.WriteLine("o is Class2");
            a = (Class2)o; // Works
            a = o; // **implicit cast won't work - error CS0266**
        }
    }
    static void Main()
    {
        Class1 c1 = new Class1();
        Class2 c2 = new Class2();        
        Test(c2);
    }
}

当我试图隐式转换a = o时,它给出了错误CS0266。 据我所知,将引用类型转换为直接或间接祖先类是一种扩展转换,因此程序可以隐式进行转换。

b是从a派生出来的,为什么隐式演员不起作用?

2 个答案:

答案 0 :(得分:3)

符合C#标准:

  

因此,不允许转换运算符从对象转换为对象,因为对象和所有其他类型之间已存在隐式和显式转换。

https://msdn.microsoft.com/en-us/library/aa664464(v=vs.71).aspx

此外,请参阅http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf

13.1.4 Implicit reference conversions中定义的所有可能的隐式转化

答案 1 :(得分:1)

我想用一个例子来回答这个问题。

double d = 1.35456;
int i = d;

此代码将抛出相同的错误 CS0266。

为什么?

在我看来,由于在将较大类型转换为较小类型时可能会丢失信息,因此语言希望通过强制您使用显式转换来确保您有意地转换类型。

您的情况与您尝试将对象类型转换为 C2 类类型的情况类似。这个 Object O 可以指向任何 Class 类型。例如,您可以考虑以下代码,其中引入了一个新类 C3,该类从 C2 派生并具有额外的属性。

using System;

class Class1 { }
class Class2 : Class1{ }
class Class3: Class2{ public  string S{get; set;} }

public class IsTest
{
     static void Test(object o)
    {
        Class1 a;
        Class2 b;

           if (o is Class2)
        {
            Console.WriteLine("o is Class2");
            a = (Class2)o;
        }


    }
    public static void Main()
    {
        Class1 c1 = new Class1();
        Class3 c3 = new Class3(){ S = "This is Lost"};
        Test(c3);

    }
}

当以您指定的方式进行转换时,我们会失去此属性,因此该语言迫使您将其设为显式转换。