Ily*_*nin 16 c# casting explicit
这是一个非常罕见的问题,并且肯定有许多变通方法,但我想了解实际发生了什么以及它为什么不起作用.
所以我在测试解决方案中有3个程序集,第一个程序集具有类型ClassA:
public class ClassA
{
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
第二个程序集引用第一个程序集并具有ClassB:
public class ClassB
{
public string Name { get; set; }
public static explicit operator ClassA(ClassB objB)
{
return new ClassA
{
Name = objB.Name
};
}
}
Run Code Online (Sandbox Code Playgroud)
它有一个显式运算符强制转换为类型ClassA.假设我们不能出于某种原因使用继承,只使用转换作为将一种类型转换为另一种类型的便捷方式.
现在,最后一个程序集引用第二个程序集(而不是第一个程序集!)并且类型为ClassC:
public class ClassC
{
public string Name { get; set; }
public static explicit operator ClassB(ClassC objC)
{
return new ClassB
{
Name = objC.Name
};
}
}
Run Code Online (Sandbox Code Playgroud)
它使用显式强制转换运算符的原因与ClassB相同.
现在有趣的部分:如果我尝试在我的代码中从ClassC转换为ClassB,如下所示:
ClassC objC = new ClassC();
ClassB objB = (ClassB)objC;
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
错误1类型"FirstAssembly.ClassA"在未引用的程序集中定义.您必须添加对程序集"FirstAssembly,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null"的引用.
我可以轻松地创建ClassB的新实例,并使用ClassC实例中的值初始化它(就像我在显式转换操作符中一样),它可以正常工作.那么这里有什么问题?
在 C# 语言规范(版本 4.0)的 6.4.5 用户定义的显式转换部分中,内容如下:
\n\n\n\n\n用户定义的从类型 S 到类型 T 的显式转换的处理\n如下:
\n\n\xe2\x80\xa2 确定类型 S0 和 T0。如果 S 或 T 是可空类型,则 S0 和 T0 是它们的基础类型,否则 S0 和 T0 分别等于 S 和 T。
\n\n\xe2\x80\xa2 查找类型集 D,将从中考虑用户定义的转换\n 运算符。该集合由 S0(如果 S0 是类或结构)、S0 的基类(如果 S0 是类)、T0(如果 T0\n 是类或结构)以及 T0 的基类(如果 T0 是一个类)。
\n
它没有定义编译器如何“查找类型集”,但我认为它会搜索所有相关的类,寻找下一步的候选者:
\n\n\n\n\n\xe2\x80\xa2 查找适用的用户定义和提升\n 转换运算符集 U。该集由 D 中的类或结构声明的用户定义和\n 提升\n 隐式或显式转换运算符组成从 S\n 包含或包含的类型转换为 T 包含或包含的类型。如果 U 为空,则转换未定义,并且会发生编译时错误。
\n
这会导致它尝试解析对 ClassA 的引用。
\n