Csharp/C#教程:C#是具有generics类型约束的generics类型分享


C#是具有generics类型约束的generics类型

让我们假设一个界面

interface IOwnedBy where T : IOwner { T Owner { get; } } 

 interface IOwner { public int Id { get; } } 

在我的代码的某处,我想做以下事情:

 if (obj is OwnedBy) { DoSomethingWith( obj.Owner.Id ); } 

基本上,我想检查obj是否是任何OwnedBy实现。 由于IOwner是任何generics参数的类型约束,我认为这个可行。 但这种情况从未得到满足。

没有使用很多reflection的任何方式?

将接口更改为T协变:

 interface IOwnedBy where T : IOwner { T Owner { get; } } 

obj is OwnedBy失败,因为编译器无法知道它是否安全 ; IOwnedBy被声明为不变量。 如果你明确地告诉编译器它是协变的,那么它就知道转换是安全的并且它将起作用。

为什么在不变的界面中它不安全? 考虑以下:

上述就是C#学习教程:C#是具有generics类型约束的generics类型分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

 interface IOwnedBy where T : IOwner { T Owner { get; } void SetOwner(T Owner); } class Person: IOwner { } class Cat: IOwner { } Cat tom = ... IOwnedBy owned = ... var nope = owned as IOwnedBy; nope.SetOwner(tom); //Ouch! Just set a cat as an owner of a IOwnedBy 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1001823.html

(0)
上一篇 2021年12月27日
下一篇 2021年12月27日

精彩推荐