给定这些类型:
class A { }
class B
{
public static implicit operator A(B me)
{
return new A();
}
}
class Test<T> where T : A { }
我试过了
var b = new Test<B>();
并预计它会失败,但它确实失败了。但是报错信息是
The type 'B' cannot be used as type parameter 'T' in the generic type or method 'Test'. There is no implicit reference conversion from 'B' to 'A'.
但是是从 B 到 A 的隐式引用转换。这只是一条奇怪的消息吗? 不是隐式引用转换正如亚当罗宾逊的回答所示。消息是正确的。
请注意 MSDN says:
where T : (base class name) - The type argument must be or derive from the specified base class.
这解释了为什么它是不允许的,因为 B
不是从 A
派生的
最佳答案
不,你想做的事是不可能的。隐式引用 转换与隐式类型 转换不同。您的代码定义了一个隐式类型转换,您可以在其中执行以下操作:
B foo = new B();
A bar = foo;
但是请注意,foo
和 bar
现在包含不同的引用。隐式类型转换创建了 A
的新实例,它应该(按照惯例)在逻辑上等同于 foo
。但关键是它是一个不同的引用。
引用 转换将是引用本身不改变的地方,这意味着所讨论的类型必须继承自(对于类)或实现(对于接口(interface))所讨论的类型。如果我这样做:
class A { }
class B : A { }
然后我上面的代码现在将在 foo
和 bar
中包含相同的引用。这就是隐式引用转换的含义。相反,显式引用转换将是向下转换,如下所示:
A foo = new B();
B bar = (B)foo;
同样,引用是相同的,但转换是明确的。
因此,简而言之,MSDN 文档更清晰但不够精确。
关于c# - 你能用隐式转换满足通用约束吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8172112/