当前位置: 首页 > 编程语言 > C#

是否可以定义一个无法实现的有效C#接口?分享

时间:2023-04-11 01:51:00 C#

是否可以定义一个有效的C#接口,但不能实现?几天来我一直在思考这个(元)问题:是否可以定义无法以任何方式实现的有效C#接口?这个问题的可能变化:IsitpossibletodefinesuchaninterfaceinC#2.0,3.0,4.0,5.0?是否可以定义在实现时甚至不编译的接口,或者可以编译但抛出运行时异常的接口?编辑:我知道这样的接口在定义上是无用的,但对于编程工作的口语或测试申请人来说,他们对C#的了解程度是一个很好的答案。是否可以定义一个无法实现的有效C#接口?这个琐碎的问题不适合StackOverflow,但它很简单,也很容易回答。(事实证明是错误的!继续阅读!)classC{privateC(){}}interfaceIFoowhereT:C,new(){}IFoo不能为任何T实现,因为没有类型参数可以替换T.C不起作用,因为C没有公共的无参数构造函数,并且您不能拥有C派生类,因为默认构造函数是私有的。(好吧,C中可能有一个可访问的派生类C,但在这种情况下它不存在。)更新:评论者“Mikez”正确地指出了这一点classX:IFoowhereT:C,new(){}实现接口,虽然现在当然没有办法实例化X!更好的是,用户“GranBurguesa”指出,只要从不调用私有构造函数,就允许声明派生类C;这只有在它在实例化时崩溃和死亡时才有可能。(好吧,挑剔一点,也可以将递归调用优化为无限循环而不是崩溃。)这两种狡猾的解决方法都提出了一个哲学问题:如果一个接口是由一个没有人可以实例化的类实现的,那么它实际上是这样做的吗成真?当然GranBurgues证明了IFoo是可以实现和构建的,所以我的回答其实是错误的。还有一些情况,例如SLaks已删除的答案中暗示的情况,滥用通用机制会导致“无限”类型。这些类型在CLR中是不合法的;C#设计团队考虑过在C#编译器规范中添加类似的语言,但尚未解决。使用这些类型可能会使编译器或运行时崩溃。有关使编译器崩溃的无限类型的示例,请参阅我的文章:InfinitybutnotBeyond这是一个。将此代码剪切并粘贴到VisualStudio中,您将看到无法实现此接口::classProgram{staticvoidMain(string[]args){Dtest=newD();}}classC{privateC(){}}interfaceIFoowhereT:C,new(){}classD:C{publicD():this(5){}publicD(intx):this(){}}classDfoo:IFoo{}它在实例化D时编译正常,但因StackOverflowException而崩溃。如果您正在尝试分解旧接口,则可以使用ObsoleteAttribute属性标记该接口。编辑:正如@Magnus在评论中指出的那样,如果Error属性设置为true,它的使用将导致错误。如果一个类型是可访问和未密封的,那么外部代码就可以创建该类型的实例,而原始类型不能对其做任何事情。无需“完全信任”或反思。publicclassCantDeriveMe{privateCantDeriveMe(){}publicoverridestringToString(){return"Mytypeis"+this.获取类型()。字符串();}}publicclassOhYeah:CantDeriveMe{staticOhYeahCapturedInstance;{CapturedInstance=这个;}OhYeah():this(1/String.Empty.Length){}OhYeah(intblah):this(){}publicstaticOhYeahCreate(){try{newOhYeah(4);}catch(DivideByZeroException){GC.Collect();GC.WaitForPendingFinalizers();}返回CapturedInstance;}publicstaticvoidtest(){哦是的;它=OhYeah.Create();Console.WriteLine("结果是({0})",它);请注意,如果代码仅用C#编写,如果基类析构函数注意到对象不是合法类型,而是用C#以外的语言编写的,则基类析构函数可能会发出声音。代码将允许重写Finalize而无需链接到它的父母。我认为可以指定一个开放的通用接口,它结合了结构和类约束,类型的组合是不可能的,例如publicinterfaceevilwhereT:struct,UwhereU:class我不确定这样的开放泛型类型是否是真的有资格作为一个“接口”,或者它只是一个封闭的泛型类型,实际上可以是一个接口(或类或结构)。以上是C#学习教程:IsitpossibletodefineavalidC#interfacethatcannotimplemented?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: