为啥我不能将接口与显式运算符一起使用? [复制]

Posted

技术标签:

【中文标题】为啥我不能将接口与显式运算符一起使用? [复制]【英文标题】:Why can't I use interface with explicit operator? [duplicate]为什么我不能将接口与显式运算符一起使用? [复制] 【发布时间】:2011-01-26 20:29:08 【问题描述】:

我只是想知道是否有人知道为什么不允许您使用带有隐式或显式运算符的接口?

例如这会引发编译时错误:

public static explicit operator MyPlayer(IPlayer player)

 ...

“不允许用户定义的与接口之间的转换”

谢谢,

【问题讨论】:

最简单的方法是,只需为您的具体类实现接口 :) 另请参阅***.com/questions/308986/… 让我们开始吧,publicstatic 都不允许出现在接口成员定义中.. 【参考方案1】:

Section 10.9.3 of the C# spec 说明了这一点。简短的版本是它是不允许的,以便用户可以确定当且仅当引用类型实际实现该接口时,引用类型和接口之间的转换成功,并且当该转换发生时,实际上引用了相同的对象。

定义引用类型之间的隐式或显式转换让用户期望引用会发生变化;毕竟,同一个引用不能同时是两种类型。另一方面,用户确实对引用类型和接口类型之间的转换有相同的期望。

用户定义的转换不允许从interface-types转换。特别是,此限制可确保在转换为 interface-type 时不会发生用户定义的转换,并且只有当对象为转换后实际上实现了指定的interface-type

【讨论】:

“定义引用类型之间的隐式或显式转换让用户期望引用会发生变化”很好的解释! 这解释了为什么语言设计团队会阻止隐式转换接口类型。你知道为什么他们还决定限制 from 接口类型的转换吗?只是为了对称吗? 是的,无法从接口类型转换为严格类型是一个非常烦人的缺失功能。特别是对于像 JSON.NET 这样的东西,它会尝试转换它,而你基本上不能,因为 C# 不允许用户定义将反序列化接口转换为具体类型。

以上是关于为啥我不能将接口与显式运算符一起使用? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中实现接口与显式实现接口 [重复]

Laravel 急切加载与显式连接

隐式线程与显式线程性能[关闭]

js 的隐式转换与显式转换

为啥接口的显式实现不能公开?

C#'var'关键字与显式定义的变量[重复]