0

从 C# 4.0 规范第 6.1.6 节:

隐式引用转换是:

[...]

从任何引用类型到接口或委托类型 T,如果它具有到接口或委托类型 T0 的隐式标识或引用转换,并且 T0 可变量转换(13.1.3.2)到 T。

Vladimir Reshetnikov 告诉我们,存在从List<string>to的隐式引用转换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;
    //}
}
4

1 回答 1

3

如果您希望用户定义的类或结构可隐式转换为接口,请让您的类/结构实现该接口。

(编辑)

如果您想IC<B>隐式转换为,请通过指定关键字.IC<A>使IC<T>接口协变。您给出的规范中的引用表明这两个隐式转换的“组合”也是一种隐式转换。Toutinterface IC<out T> { }

来源:

interface IC<out T> {  }

class D<T> : IC<T>  { }

(结束编辑)

关于List<string>类,它实现了whichIEnumerable<string>又可以(隐式)转换为,IEnumerable<object>因为在.IEnumerable<out T>outT

(他们不允许您进行public static implicit operator转换到/从接口转换的一个原因是,有些人可以编写一个从您的类继承实现接口的派生类。这将在他们的类之间进行“自然”转换和接口,但public static implicit operator也适用,导致类型之间的两种转换(一种“自然”和一种“用户定义”),这会令人困惑和模棱两可。)

于 2013-02-08T22:06:49.083 回答