接口、泛型和隐式操作

本文关键字:操作 泛型 接口 | 更新日期: 2023-09-27 18:22:09

假设我有以下类型:

public class Foo<T>
{
    public Foo(T value)
    {
         Value = value;
    }
    public T Value {get;set;}
    public static implicit operator Foo<T>(T t)
    {
        return new Foo<T>(t);
    }
}
public interface IBar
{
}
public class Bar : IBar
{
}

为什么不允许我写这个?

Foo<IBar> foo = (IBar)new Bar();

但仍然被允许写这个?

Foo<Bar> foo = new Bar();

我得到这个错误:

无法将类型IBar隐式转换为Foo<IBar>。存在显式转换(是否缺少强制转换?)

我知道我不能在接口中使用隐式运算符,但当接口是泛型参数时,为什么我不能使用它们呢?

接口、泛型和隐式操作

如果删除泛型参数,并且只有operator Foo(IBar t),则会引发CS0552。

不能创建到接口或从接口进行的用户定义转换。如果需要转换例程,请通过将接口设为类或从接口派生类来解决此错误。

因此,不允许在接口之间进行用户定义的转换。这与你得到的第一个错误有关:

无法将类型IBar隐式转换为Foo<IBar>。存在显式转换(是否缺少强制转换?)

如果已经有显式转换(现在从IBarFoo),就不可能有隐式转换。

因此,您不能重载从接口到接口的用户定义转换,因为已经为该类型定义了内置转换(尽管是显式转换)。

我不完全确定我要说什么。这不是因为它不会接受向接口抛出的东西吗(因为不能从类中创建对象),而是会接受实现接口的所有东西。