接口、泛型和隐式操作
本文关键字:操作 泛型 接口 | 更新日期: 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>。存在显式转换(是否缺少强制转换?)
如果已经有显式转换(现在从IBar到Foo),就不可能有隐式转换。
因此,您不能重载从接口到接口的用户定义转换,因为已经为该类型定义了内置转换(尽管是显式转换)。
我不完全确定我要说什么。这不是因为它不会接受向接口抛出的东西吗(因为不能从类中创建对象),而是会接受实现接口的所有东西。