C#为泛型类创建隐式转换?

时间:2011-08-04 18:10:20

标签: c# generics

我有一个泛型类,我曾经将数据写入IsolatedStorage。

我可以使用static implicit operator T()从我的Generic类转换为Generic Parameter T

e.g。

MyClass<double> foo = new MyClass(187.0);

double t = foo;

我的问题是,我该如何反过来?

MyClass<double> foo = new MyClass(187.0);
double t = 0.2d;
foo = t;

隐式运算符必须是静态的,所以我不确定如何传递我的类的实例?

3 个答案:

答案 0 :(得分:16)

此课程显示T和MyClass之间的转换。

class MyClass<T>
{
  public MyClass(T val)
  {
     Value = val;
  }

  public T Value { get; set; }

  public static implicit operator MyClass<T>(T someValue)
  {
     return new MyClass<T>(someValue);
  }

  public static implicit operator T(MyClass<T> myClassInstance)
  {
     return myClassInstance.Value;
  }
}

答案 1 :(得分:7)

编辑:

如果您希望能够更改班级中T的值,我建议将其公开为以下属性:

T Value { get; set; }

这将允许您更改值,而不是隐式运算符返回该类的全新实例的行为。


您可以也可以不使用隐式运算符。做点什么

 public static implicit operator int(MyType m) 
 public static implicit operator MyType(int m) 

将分别隐式地从MyType转换为int,从int隐式转换为MyType。但是,你是对的,因为它们是静态的,intMyType必须专门创建MyType的新实例并返回它。

所以这段代码:

MyClass<double> foo = new MyClass(187.0);
double t = 0.2d;
foo = t;

不会将foo中的值替换为t,隐式运算符会从MyClass返回全新的 t并分配那到Foo

答案 2 :(得分:1)

您应该能够通过简单地指定另一个隐式运算符来转换另一种方式:

public static implicit operator MyClass<T>(T input)
{
   return new MyClass<T>(input);
}