C# 隐式强制转换泛型<;T>;回到T

C# 隐式强制转换泛型<;T>;回到T,c#,.net,generics,.net-3.5,C#,.net,Generics,.net 3.5,如果我编写一个泛型类,比如classMyGeneric,是否可以将隐式转换写入类型T,这样我就可以执行以下操作: public class MyGeneric<T> { ... } public class GenericProperties { public MyGeneric<string> MyGenericString {get;set;} public void UseMyGeneric() { string sTest =

如果我编写一个泛型类,比如class
MyGeneric
,是否可以将隐式转换写入类型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";
   }
}
公共类MyGeneric
{
...
}
公共类泛型属性
{
公共MyGeneric MyGenericString{get;set;}
public void UseMyGeneric()
{
字符串sTest=MyGenericString;
MyGenericString=“这是一个测试”;
}
}

是否可以通过重载运算符来实现这一点?我知道如果我的课程不是一般的…

好吧,是的,但看在耶稣的份上,不要这样做。真让人困惑。我认为你有点误解了泛型的目的。它不用于将类“转换”为该类型,而是用于让该类型(MyGenericString)意识到您想要的类型,用于各种目的(通常是基于集合的目的)。

是的。但不要做得太多,这会让人感到困惑。我只会将其用于包装器类型

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
类包装器
{
公共T值{get;私有集;}
公共包装器(T val){Value=val;}
公共静态隐式运算符T(包装器){return Wrapper.Value;}
公共静态隐式运算符包装器(T val){返回新包装器(val);}
}
var intWrapper=新包装(7);
var usingIt=7*intWrapper//49
包装器someWrapper=9//呜呼

是的,可以使用隐式

类程序
{
静态void Main(字符串[]参数)
{
myclass a=新的myclass();
a、 internal=“你好”;
字符串b=a;
控制台写入线(b);
}
}
类myclass
{
公共交通内部;
公共myclass()
{
}
公共静态隐式运算符T(myclass arg1)
{
返回arg1.inner;
}
}

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

C<object> c = new C<object>("hello");
object o = (object) c;
cc=newc(“你好”);
对象o=(对象)c;
会发生什么?您的用户定义转换是否运行否,因为c已经是一个对象。


就像我说的,当你试图定义泛型转换操作符时,你会遇到一些疯狂的情况除非您对本规范第10.10.3节有深入详细的了解,否则不要这样做。

我比您投了更高的票,因为它在技术上是正确的(最好的一种正确),但实际上,我认为这样做几乎永远都不合适。我希望OP意识到这一点。谢谢。为了《僵尸耶稣》,我也比你投了更高的票,因为我同意。我很想看到它的实际用途。@nobugz:
Nullable
有一个
显式运算符T
。以及从
T
的隐式转换。那很实用!我同意,这个特性是有用的,但给出的示例似乎不好,表明对泛型的用途可能存在误解。
C<object> c = new C<object>("hello");
object o = (object) c;