当我尝试使用从接口类型到泛型结构类型的用户定义转换运算符时,我收到一个编译错误,指出无法转换类型:
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 是一个类,则转换将起作用。
有一个关于转换为 class 的类似问题,答案是派生类可能实现接口并在是否应使用用户定义的强制转换方面产生歧义。但是对于结构体,不能有派生类型,编译器知道我的结构体没有实现 J。
也许是为了避免接口实现新接口时出现意外的语义变化?也许这只是偶然?也许我犯了一个天真的错误?引用规范会很棒,但我真的很喜欢它最初是这样设计的原因。