通用约束和接口实现/inheritance
不完全确定如何表达这个问题,因为它是“为什么这不起作用?” 查询类型。
我已将我的特定问题减少到此代码:
public interface IFoo { } public class Foo : IFoo { } public class Bar where T : IFoo { public Bar(T t) { } public Bar() : this(new Foo()) // cannot convert from 'Foo' to 'T' { } }
现在, Bar
类中的generics类型T
必须实现IFoo。 那么为什么编译器会在评论中给出错误? 当然,Foo的一个实例是IFoo,因此可以作为generics类型T
的代表传递?
这是编译器限制还是我遗漏了什么?
您还可以使用Fiz以任何其他方式实现与Foo无关的IFoo:
public interface IFoo { } public class Foo : IFoo { } public class Fiz : IFoo { } Foo foo = new Foo(); Fiz fiz = foo; // Not gonna compile.
你想要的可能更像是:
public class Bar where T : IFoo, new() { public Bar(T t) { } public Bar() : this(new T()) { } }
所以你可以拥有
Bar barFoo = new Bar (); Bar barFiz = new Bar ();
如果你创建一个类Baz,然后是generics类型Bar baz = new Bar(),那么由构造函数重载定义的新Foo()将不是T类型,在本例中是Baz。
这是因为如果你创建一个类:
public class Fred : IFoo { }
然后像这样实例化Bar
:
var bar = new Bar();
然后它违反了类的约束,因为Foo
不是Fred
,它是当前的T
您可以通过在构造函数中放置InvalidCastException
序列(T)(IFoo)new Foo()
来强制进行编译,但如果T
的实际类型不能从Foo
分配,则会在运行时获得InvalidCastException
。
上述就是C#学习教程:通用约束和接口实现/inheritance分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1039220.html