隐式地将泛型<T>转换回T

Jer*_*emy 8 .net c# generics .net-3.5

如果我像类一样编写泛型类MyGeneric<T>,可以将一个隐式转换写入类型T,所以我可以这样做:

public class MyGeneric<T>
{
...
}

public class GenericProperties
{
   public MyGeneric<string> MyGenericString {get;set;}

   public void UseMyGeneric()
   {
       string sTest = MyGenericString;
       MyGenericString = "this is a test";
   }
}
Run Code Online (Sandbox Code Playgroud)

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

dan*_*dan 21

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

class Wrapper<T>
{
    public T Value {get; private set;}
    public Wrapper(T val) {Value = val;}

    public static implicit operator T(Wrapper<T> wrapper) {return wrapper.Value;}
    public static implicit operator Wrapper<T>(T val) {return new Wrapper<T>(val);}
}



var intWrapper = new Wrapper<int>(7);
var usingIt = 7 * intWrapper; //49

Wrapper<int> someWrapper = 9; //woohoo
Run Code Online (Sandbox Code Playgroud)

  • @nobugz:`Nullable <T>`有一个`显式运算符T`.并且来自*`T`的隐式转换*.这很实用! (6认同)
  • 我赞成你,因为它在技术上是正确的(最好的正确),但实际上,我认为这样做几乎不合适.我希望OP意识到这一点. (2认同)

Noo*_*ilk 19

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

  • +1只是为了"为僵尸耶稣的爱"LOL (11认同)

Eri*_*ert 14

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

C<object> c = new C<object>("hello");
object o = (object) c;
Run Code Online (Sandbox Code Playgroud)

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

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