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

Ala*_*lan 10 c# generics

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

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

例如

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

double t = foo;
Run Code Online (Sandbox Code Playgroud)

我的问题是,我该怎么做呢?

MyClass<double> foo = new MyClass(187.0);
double t = 0.2d;
foo = t;
Run Code Online (Sandbox Code Playgroud)

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

And*_*ren 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;
  }
}
Run Code Online (Sandbox Code Playgroud)


Chr*_*ens 8

编辑:

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

T Value { get; set; }
Run Code Online (Sandbox Code Playgroud)

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


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

 public static implicit operator int(MyType m) 
 public static implicit operator MyType(int m) 
Run Code Online (Sandbox Code Playgroud)

将隐式转换从MyTypeintintMyType分别.但是,你是对的,因为它们是静态的int,MyType特别需要创建一个新实例MyType并返回它.

所以这段代码:

MyClass<double> foo = new MyClass(187.0);
double t = 0.2d;
foo = t;
Run Code Online (Sandbox Code Playgroud)

不会替换foowith中的值t,隐式运算符将返回一个全新 MyClasst并将其赋值给Foo.

  • 我到处都会使用`.Value`.它使您的代码更清晰,更易读.隐式运算符很方便,但过度使用很容易使代码难以阅读.你正在以正确的方式做到这一点. (2认同)