我有以下代码使用显式转换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派生出来的,为什么隐式演员不起作用?
答案 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);
}
}
当以您指定的方式进行转换时,我们会失去此属性,因此该语言迫使您将其设为显式转换。