代码之家  ›  专栏  ›  技术社区  ›  Matt Hamilton

通用约束和接口实现/继承

  •  13
  • Matt Hamilton  · 技术社区  · 16 年前

    不完全确定该如何表达这个问题,因为这是一个“为什么这不起作用?”类型的查询。

    public interface IFoo
    {
    }
    
    public class Foo : IFoo
    {
    }
    
    public class Bar<T> where T : IFoo
    {
        public Bar(T t)
        {
        }
    
        public Bar()
            : this(new Foo()) // cannot convert from 'Foo' to 'T'
        {
        }
    }
    

    T Bar<T> T ?

    3 回复  |  直到 16 年前
        1
  •  13
  •   Nathan W    16 年前

    您还可以有一个实现IFoo的Fiz,它以任何其他方式与Foo无关:

    public interface IFoo
    {
    }
    
    public class Foo : IFoo
    {
    }
    
    public class Fiz : IFoo
    {
    }
    
    Foo foo = new Foo();
    Fiz fiz = foo; // Not gonna compile.
    

    您想要的可能更像:

    public class Bar<T> where T : IFoo, new()
    {
        public Bar(T t)
        {
        }
    
        public Bar()
            : this(new T()) 
        {
        }
    }
    

    Bar<Foo> barFoo = new Bar<Foo>();
    Bar<Fiz> barFiz = new Bar<Fiz>();
    
        2
  •  2
  •   Timothy Carter    16 年前

    如果创建一个类Baz,然后泛型类型Bar Baz=new Bar(),则构造函数重载定义的new Foo()将不是T类型,在本例中为Baz。

        3
  •  0
  •   Greg Beech    16 年前

    这是因为如果创建一个类:

    public class Fred : IFoo
    {
    }
    

    然后实例化 Bar<T>

    var bar = new Bar<Fred>();
    

    然后,它违反了类的约束 Foo Fred T

    您可以通过放置强制转换序列来强制编译它 (T)(IFoo)new Foo() 在构造函数中,但您将得到 InvalidCastException T 不可从