隐式地将generics转换回T

如果我写类MyGeneric这样的generics类是可以写一个隐式MyGeneric为类型T,所以我可以这样做:

 public class MyGeneric { ... } public class GenericProperties { public MyGeneric MyGenericString {get;set;} public void UseMyGeneric() { string sTest = MyGenericString; MyGenericString = "this is a test"; } } 

可以通过重载运算符来实现吗? 我知道如果我的class级不是通用的话可以做到……

嗯,是的,但是对于僵尸耶稣的爱,不要这样做。 这真的令人困惑。 我认为你有点误解了仿制药的目的。 它不习惯将类“转”为该类型,它曾经用于使该类型(MyGenericString)“了解”您想要的类型,用于各种目的(通常是那些基于集合的目的)。

是的,但不要过度,这往往会让人感到困惑。 我只会将它用于包装类型。

 class Wrapper { public T Value {get; private set;} public Wrapper(T val) {Value = val;} public static implicit operator T(Wrapper wrapper) {return wrapper.Value;} public static implicit operator Wrapper(T val) {return new Wrapper(val);} } var intWrapper = new Wrapper(7); var usingIt = 7 * intWrapper; //49 Wrapper someWrapper = 9; //woohoo 

正如其他人所说,这是合法危险的 。 你可能陷入许多陷阱。 例如,假设您在C和T之间定义了一个用户定义的转换运算符。那么你说

 C c = new C("hello"); object o = (object) c; 

怎么了? 您的用户定义转换是否运行? 不,因为c已经是一个对象。

就像我说的那样,当你尝试定义generics转换运算符时,你会遇到一些疯狂的情况; 除非您对规范的第10.10.3节有深入而详细的了解,否则不要这样做。

是的,可以使用隐式转换运算符重载

 class Program { static void Main(string[] args) { myclass a = new myclass(); a.inner = "Hello"; string b = a; Console.WriteLine(b); } } class myclass { public T inner; public myclass() { } public static implicit operator T(myclass arg1) { return arg1.inner; } }