C# 引用类型上的隐式强制转换

C# 引用类型上的隐式强制转换,c#,casting,C#,Casting,下面的代码带有显式casta=(Class2)o 当我试图隐式强制转换a=o时,它给出了错误CS0266。 据我所知,将引用类型转换为直接或间接祖先类是一种扩展转换,因此程序可以隐式进行转换 b是从a派生的,那么隐式转换为什么不起作用呢?它符合C标准: 因此,不允许转换运算符从对象转换或转换为对象,因为对象和所有其他类型之间已经存在隐式和显式转换 除此之外,请参见13.1.4隐式引用转换中定义的所有可能的隐式转换,我想用一个例子来回答这个问题 double d = 1.35456; int i

下面的代码带有显式cast
a=(Class2)o

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

b是从a派生的,那么隐式转换为什么不起作用呢?

它符合C标准:

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


除此之外,请参见
13.1.4隐式引用转换中定义的所有可能的隐式转换,我想用一个例子来回答这个问题

double d = 1.35456;
int i = d;

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

为什么?

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

您尝试将对象类型转换为类C2类型的情况与此类似。此对象可以指向任何类类型。例如,您可以考虑下面的代码,其中引入了一个新类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);

    }
}


当以您指定的方式强制转换时,我们将丢失此属性,因此该语言将强制您将其设置为显式强制转换。

--它可以工作是的,它可以与显式强制转换a=(Class2)o一起工作,但不能与隐式强制转换a=o一起工作;类Class1{}class Class2:Class1{}class IsTest{static void Test(对象o){Class1 a;Class2 b;if(o是Class2){Console.WriteLine(“o是Class2”);a=o;//隐式转换不起作用-错误CS0266}}静态void Main(){class1c1=newclass1();class2c2=newclass2();Test(c2);}代码不与文本对齐-根本没有使用b…答案与自定义转换运算符有关…而OP似乎只是试图将基于类型的类型隐式转换为派生类型…@AlexeiLevenkov下半部分是关于隐式转换的。
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);

    }
}