鉴于这些类型:
class A { }
class B
{
public static implicit operator A(B me)
{
return new A();
}
}
class Test<T> where T : A { }
I tried
var b = new Test<B>();
并预计它会失败,而它确实失败了。但错误信息是
类型“B”不能用作泛型类型或方法“Test”中的类型参数“T”。没有从“B”到“A”的隐式引用转换。
但是有is从 B 到 A 的隐式引用转换。这只是一个奇怪的消息吗? 有not正如 Adam Robinson 的回答所示,隐式引用转换。该消息是正确的。
注意MSDN 说: http://msdn.microsoft.com/en-us/library/d5x73970.aspx
其中 T :(基类名称)- 类型参数必须是指定的基类或派生自指定的基类。
这解释了为什么不允许这样做B
不源自A
不,你想要做的事情是不可能的。隐含的参考转换与隐式转换不同type转换。您的代码定义了隐式类型转换,您可以在其中执行以下操作:
B foo = new B();
A bar = foo;
但请注意,foo
and bar
现在包含不同的引用。隐式类型转换创建一个new的实例A
(按照惯例)逻辑上应该等于foo
。但重点是这是一个不同的参考。
A 参考转换是引用本身不改变的地方,这意味着所讨论的类型必须继承(对于类)或实现(对于接口)所讨论的类型。如果我这样做:
class A { }
class B : A { }
那么我上面的代码现在将在中保存相同的引用foo
and bar
。这就是隐式引用转换的含义。相反,一个explicit引用转换将是向下转型,如下所示:
A foo = new B();
B bar = (B)foo;
同样,参考文献是相同的,但演员阵容是明确的。
所以,简而言之,MSDN 文档更清晰,但不太精确。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)