【发布时间】:2013-02-08 22:03:37
【问题描述】:
来自 C# 4.0 规范第 6.1.6 节:
隐式引用转换为:
[...]
从任何引用类型到接口或委托类型 T,如果它有 到接口的隐式标识或引用转换或 委托类型 T0 和 T0 可通过变量 (13.1.3.2) 转换为 T。
Vladimir Reshetnikov 告诉我们,存在从 List<string> 到 IEnumerable<object> 的隐式引用转换。但是,我如何将其应用于用户定义的类型(甚至可能)?
我尝试了隐式运算符、自定义派生类型和其中的一些变体......但我无法重现场景。我有:
class Program
{
static void Main(string[] args)
{
IEnumerable<object> specialClassConversion = new List<string>();
IEnumerable<A> userdefinedTypeConversion = new List<B>();
A implicitConversion = new B();//varience-convertible
IC<A> explicitConversion = (IC<A>)new D<B>();//OK, varience-convertible
IC<A> implicitConversion2 = new D<B>();//does not compile
}
}
class A { }
class B : A { }
interface IC<T> { }
class D<T>
{
//public static implicit operator IC(D<T> m)//Error: user-defined conversions to or from an interface are not allowed
//{
// return null;
//}
}
【问题讨论】:
-
你引用的摘录中的“隐式转换”并不意味着“存在隐式转换运算符”,它只是意味着“不需要显式转换的转换”
-
IC<A> explicitConversion = (IC<A>)new D<B>();也不行,演员应该在运行时失败。除非接口被声明为interface IC<in T>或interface<out T>。 (我不记得究竟哪个是泛型实例之间的子类型关系以及这对子类型关系意味着什么。)如果它们是可变可转换的,那么后面的行将编译。 -
@millimoose 其实
"an implicit conversion operator exists"正是的意思。请注意,语言提供从类型到其所有基类型以及它实现的任何接口的隐式转换,因此它不仅仅是用户或语言定义的转换运算符。 -
@Servy Under operator 我的意思是 C# 允许你实现的特殊方法——我不认为语言提供的转换是“运算符”。我想我应该更好地表达该评论。更好的版本应该是:“隐式转换”并不only 意味着您已经定义了一个隐式转换运算符方法,而是 any 不需要的转换显式转换(用户定义或语言定义。)
-
嗯,
List<T>和IEnumerable<T>都是用户定义的类型,所以它一定是有可能的。
标签: c#