在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-headerattributes opt method-modifiers opt partial opt return-type member-name type-parameter-list optformal-parameter-list opttype-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(new object { }); IFoo bar = foo; bar.Item="123"; var b = Object.ReferenceEquals(foo, bar); // true 

顺便说一下,通用接口的差异只能从.netfx 4.0获得。