从引用类型到用户定义类型的接口的隐式引用转换

本文关键字:接口 引用 转换 类型 引用类型 用户 定义 | 更新日期: 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也将适用,导致类型之间的两次转换(一个"自然"和一个"用户定义"(,这将是混乱和模棱两可的。