C# 接口、泛型和隐式操作

C# 接口、泛型和隐式操作,c#,generics,interface,implicit-conversion,C#,Generics,Interface,Implicit Conversion,假设我有以下类型: 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 interfac

假设我有以下类型:

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
{
公共食品(T值)
{
价值=价值;
}
公共T值{get;set;}
公共静态隐式运算符Foo(T)
{
返回新的Foo(t);
}
}
公共接口IBar
{
}
公共类酒吧:IBar
{
}
为什么不允许我写这个

Foo<IBar> foo = (IBar)new Bar();
Foo-Foo=(IBar)新条();
但仍然允许写这个

Foo<Bar> foo = new Bar();
Foo-Foo=newbar();
我得到这个错误:

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


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

如果删除泛型参数,只使用
运算符Foo(IBar t)
,它会引发

无法创建用户定义的与接口之间的转换。如果需要转换例程,请通过使接口成为类或从接口派生类来解决此错误

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

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

如果已经有显式转换(现在是从IBar到Foo),就不能有隐式转换


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

我不完全确定我要说什么。
这不是因为它不接受向接口浇铸的内容(因为不能从类创建对象),而是接受实现接口的所有内容

从接口强制转换是一种内置转换。您不能覆盖内置转换。它在没有
(IBar)
的情况下工作。就我个人而言,无论如何我都不会这么做-这真的是让人困惑的代码。为什么不添加一个扩展方法呢<代码>公共静态Foo-ToFoo(这个T)?我正在考虑开发自己的类来代替System.Lazy,它在来回转换为值时有点烦人。因此,我添加了两个隐式运算符,用于从和转换到我自己的懒惰类。在我尝试将接口用作泛型参数之前,一切都运行得很好。我知道我不能隐式强制转换接口,但泛型类仍然是一个类,即使泛型参数是一个接口。@xBodro是的,但
(IBar)new Bar()
是一个接口,不能使用用户定义的运算符强制转换。