从引用类型到用户定义类型的接口的隐式引用转换
本文关键字:接口 引用 转换 类型 引用类型 用户 定义 | 更新日期: 2023-09-27 17:58:37
来自 C# 4.0 规范第 6.1.6 节:
隐式引用转换包括:
[...]
从任何引用类型到接口或委托类型 T(如果它有( 对接口的隐式标识或引用转换,或 委托类型 T0 和 T0 可将方差转换为 T。
弗拉基米尔·列舍特尼科夫告诉我们,有一个从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<B>
隐式转换为IC<A>
,请通过指定out
关键字interface IC<out T> { }
来使IC<T>
接口在T
中协变。您给出的规范中的引用表明,这两个隐式转换的"组合"也是一种隐式转换。
源:
interface IC<out T> { }
class D<T> : IC<T> { }
(结束编辑(
关于List<string>
类,它实现了IEnumerable<string>
,而又是可转换的(隐式(IEnumerable<object>
IEnumerable<out T>
因为它在T
中是协变的(out
(。
(他们不允许你制作一个与接口相互转换的public static implicit operator
的一个原因是,somone 可以编写一个从你的类继承并实现接口的派生类。这将在它们的类和接口之间提供"自然"转换,但public static implicit operator
也将适用,导致类型之间的两次转换(一个"自然"和一个"用户定义"(,这将是混乱和模棱两可的。