c#为泛型类创建隐式转换

本文关键字:转换 创建 泛型类 | 更新日期: 2023-09-27 18:04:44

我有一个泛型类,我用来写数据到IsolatedStorage。

我可以使用static implicit operator T()从我的泛型类转换到泛型参数T

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

我的问题是,我怎样才能反过来呢?

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

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

c#为泛型类创建隐式转换

这个类显示了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;
  }
}

EDIT:

如果你想在你的类中改变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,隐式运算符将从t返回一个全新的 MyClass,并将其赋值给Foo

您应该能够通过简单地指定另一个隐式操作符以另一种方式进行转换:

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