为什么不允许从“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 : IXwhere T : IX,则会发生相同的错误。但是,我选择了一个更复杂的示例,因为一个更简单的示例可能会引发规避性答案,例如"只需将xy类型从T更改为IX">,这不会回答为什么这种转换失败。

为什么不允许从“A 类:IX”转换为通用“T ,其中 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();
}