在C#中是否可以通过以下方式重载通用转换运算符?
只是想知道是否还有代表C#3.5中的以下代码:
public struct Foo { public Foo(T item) { this.Item = item; } public T Item { get; set; } public static explicit operator Foo ( Foo a ) where U : T { return new Foo((U)a.Item) } }
谢谢
转换运算符不能是通用的。 从规范部分10.10开始,这是convert-operator-declarator的格式:
conversion-operator-declarator : 隐式运算符类型 ( 类型 标识符 ) 显式运算符类型 ( 类型 标识符 )
比较一下,比较一个方法标题:
method-header : attributes opt method-modifiers opt partial opt return-type member-name type-parameter-list opt ( formal-parameter-list opt ) type-parameter-constraints-clauses opt
(抱歉格式化 – 不知道如何做得更好。)
请注意,运算符格式不包括类型参数列表或类型参数约束。
你的代码归结为这一行: return new Foo((U)a.Item)
在哪里尝试将基类分配给inheritance的类,这是不可能的。
假设T(基类)是Stream
类型而U是MemoryStream
类型(inheritance类),则不能将Stream
分配给MemoryStream
类型的变量。
我认为简短的回答是“不可能。尝试使用方法”
似乎也是这个问题的愚蠢解决方案在.NETgenerics中重载操作符约束
看起来你想要一个逆变换,但struct
是不可变的,转换你什么也买不到,你可以简单地说new Foo((U)a.Item)
就像@Gidon指出的那样。
如果您考虑将Foo
改为class级,那么我们可以有所不同:
public interface IFoo { T Item { set; } } public class Foo:IFoo { public Foo(T item) { this.Item=item; } public T Item { get; set; } // public static explicit operator Foo(U a) { // return new Foo((U)a.Item); // } }
并使用它像:
var foo = new Foo
顺便说一下,通用接口的差异只能从.netfx 4.0获得。