为什么我不能使用带显式运算符的接口?

the*_*onk 23 .net c# explicit type-conversion

我只是想知道是否有人知道你不允许使用隐式或显式运算符的接口的原因?

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

public static explicit operator MyPlayer(IPlayer player)
{
 ...
}
Run Code Online (Sandbox Code Playgroud)

"不允许在接口之间进行用户定义的转换"

谢谢,

Ada*_*son 32

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

定义引用类型之间的隐式或显式转换使用户期望引用会发生变化; 毕竟,相同的参考不能是两种类型.另一方面,用户对引用类型和接口类型之间的转换没有相同的期望.

不允许用户定义的转换从接口类型转换或转换为接口类型.特别是,此限制确保在转换为接口类型时不会发生用户定义的转换,并且只有在转换的对象实际实现指定的接口类型时,才能成功转换为接口类型.

  • 这就解释了为什么语言设计团队阻止了隐式转换_to_接口类型.你知道为什么他们还决定限制转换_from_接口类型吗?它只是为了对称吗? (11认同)
  • 是的,无法从接口类型转换为严格类型是一个非常烦人的缺失功能。特别是对于像 JSON.NET 这样的东西,它会尝试强制转换,但你基本上不能,因为 C# 不允许用户定义将反序列化接口转换为具体类型。 (2认同)