gpt4 book ai didi

c# - 当 T 是接口(interface)时,为什么我的从 T 到 SomeStruct 的转换运算符不工作?

转载 作者:太空狗 更新时间:2023-10-30 00:54:28 25 4
gpt4 key购买 nike

当我尝试使用用户定义的转换运算符从接口(interface)类型转换为通用结构类型时,出现编译错误,指出类型无法转换:

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 ,答案是派生类可能会实现该接口(interface)并在是否应使用用户定义的强制转换方面产生歧义。但是对于结构体,不能有派生类型,编译器知道我的结构体没有实现 J。

也许是为了避免在接口(interface)实现新接口(interface)时发生意想不到的语义变化?也许这只是偶然?也许我犯了一个天真的错误?引用规范中的内容会很棒,但我真的很喜欢它最初以这种方式设计的原因。

最佳答案

嗯,系统不能进行实际转换,因为S<J>不执行 J .如果您更改声明,它会正常工作:

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

在类的情况下,可以声明类的子类型确实实现了J .但是结构不能扩展,所以如果 S没有实现 J那么你可以保证没有类"is"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 都不是接口(interface)类型
  • 不包括用户定义的转换,不存在从 S 到 T 或从 T 到 S 的转换。

所以如果我没看错的话,因为 J是一个接口(interface),它不被识别为您的显式转换运算符的候选对象。

关于c# - 当 T 是接口(interface)时,为什么我的从 T 到 SomeStruct<T> 的转换运算符不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12752562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com