ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 当T是接口时,为什么我的演员运算符从T到SomeStruct不工作?

2019-05-29 22:56:18  阅读:198  来源: 互联网

标签:c type-conversion operator-overloading interface generics


当我尝试使用从接口类型到泛型结构类型的用户定义的强制转换操作符时,我收到一个编译错误,指出该类型无法转换:

public interface J { }
public struct S<T> {
    public static explicit operator S<T>(T value) {
        return new S<T>();
    }
}
public static class C {
    public static S<J> Test(J j) {
        return (S<J>)j; // <- error: cannot convert type 'J' to type 'S<J>'
    }
}

请注意,如果J是一个类,转换将起作用.

有一个similar question about converting to a class,答案是派生类可能实现接口并且在是否应该使用用户定义的强制转换时产生歧义.但是对于结构体,可能没有派生类型,编译器知道我的结构体没有实现J.

也许是为了避免意外的语义变化,因为接口实现了新的接口?也许这只是偶然的?也许我犯了一个天真的错误?从规范中引用的内容会非常棒,但我真的很喜欢它首先设计的原因.

解决方法:

那么,系统不能进行实际演员,因为S< J>没有实现J.如果您更改声明,它可以正常工作:

public struct S<T> : J {...}

在类的情况下,可以声明一个类的子类型,它实现了J.但是结构不能扩展,所以如果S没有实现J,那么你可以保证没有类“是一个” S也将实施J.因此,没有J将永远是S< T>.

那么为什么不调用你的显式强制转换运算符呢?我认为答案是在C#规范中,如this SO post所述.

6.4.1允许的用户定义转换

C#仅允许声明某些用户定义的转换.特别是,无法重新定义已存在的隐式或显式转换.
对于给定的源类型S和目标类型T,如果S或T是可空类型,则让S0和T0引用它们的基础类型,否则S0和T0分别等于S和T.仅当满足以下所有条件时,才允许类或结构声明从源类型S到目标类型T的转换:

> S0和T0是不同的类型.
> S0或T0是发生运算符声明的类或结构类型.
> S0和T0都不是接口类型.
>不包括用户定义的转换,从S到T或从T到S不存在转换.

因此,如果我正确阅读,因为J是一个接口,它不会被识别为您的显式强制转换运算符的候选者.

标签:c,type-conversion,operator-overloading,interface,generics
来源: https://codeday.me/bug/20190529/1181327.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有