为什么不允许从“A 类:IX”转换为通用“T ,其中 T : IX”
本文关键字:IX 不允许 其中 转换 为什么 | 更新日期: 2023-09-27 18:25:55
为什么以下会导致编译错误?
interface IX {}
interface IY {}
class XY : IX, IY {}
void Foo<T>() where T : IX, IY
{
T xy = new XY();
… // ^^^^^^^^
} // error: "Implicit conversion of type 'XY' to 'T' is not possible."
注意:如果class XY : IX
和where T : IX
,则会发生相同的错误。但是,我选择了一个更复杂的示例,因为一个更简单的示例可能会引发规避性答案,例如"只需将xy
类型从T
更改为IX
">,这不会回答为什么这种转换失败。
因为如果这是合法的,那么你可以这样做:
interface IPet {}
interface IMammal {}
class Dog : IPet, IMammal {}
class Cat : IPet, IMammal {}
T Foo<T>() where T : IPet, IMammal
{
return new Dog();
}
...
Cat cat = Foo<Cat>(); // Assigns a Dog to a variable of type Cat.
鉴于class ABC : IX, IY { }
和Foo<ABC>
,你希望能够使用new XY()
吗?因为你不应该有这样的期望。编译器也不会。
T 并不总是 XY。T 将是 ABC、DEF 或其他任何可以实现您的两个接口并因此满足您拥有的约束的东西。XY 不可转换为 ABC、DEF 或任何 T 的无限可能性,因此您会收到错误消息:XY 到 T 的隐式转换是不可能的。
那里合法的东西只是new T()
,只有当方法被约束为支持它时,这才是真的。
void Foo<T>() where T : IX, IY, new()
{
T obj = new T();
}