【问题标题】:What is the C# equivalent of VB.NET CType?VB.NET CType 的 C# 等价物是什么?
【发布时间】:2011-03-14 04:59:17
【问题描述】:

我试过用谷歌搜索这个,并且也在使用这个网站上的搜索功能,但我找到的答案都没有回答我的问题。

在 Visual Basic 中,如果我想要一种简单的方法将我的一个类转换为另一个自定义类,我可以定义 CType 运算符来定义如何从一个类转换为另一个类。然后我可以调用 CType( fromObject, toNewType) 进行转换,或者在 C# 中我想你可以做一个简单的转换。

但是,在 C# 中,您如何定义如何处理从一个自定义类到另一个自定义类的实际转换(就像在 Visual Basic 中使用 CType 运算符一样)?

【问题讨论】:

  • @kangkan 我看到你把我的标题改成了更具体的东西,谢谢。但是,我花了 40 分钟搜索,但我没有看到对 csharp 隐式/显式运算符的引用。

标签: c# .net vb.net


【解决方案1】:

可以使用 explicit 关键字定义自定义转换:

public static explicit operator TargetClass(SourceClass sc)
{
    return new TargetClass(...)
}

...但考虑不这样做。这会让那些必须维护您的软件的人感到困惑。相反,只需为目标类定义一个构造函数,将源类的实例作为参数:

public TargetClass(SourceClass sc)
{
    // your conversions
}

【讨论】:

  • @Jim:在 99.99% 的情况下,开发人员不希望转换比他们做的更多,尤其是对于引用类型转换。他们肯定没有准备好处理ClassCastException 以外的任何异常。最小意外原则。
  • @Michael,我想我明白你的意思。对我来说,从Square 转换为RectangleCelsius 转换为Fahrenheit 是有意义的,但从一个对象转换为不同的对象是没有意义的。
  • @Jim:这是一条很好的路线。我喜欢你的例子,但我也看到了太多过分的“聪明”。
  • 谢谢!我同意这可能会令人困惑,但我正在阅读一本新书作为复习,并意识到我没有完全理解这一点......它让我的小脑袋运转起来!
  • @Michael:其他开发人员的过度“聪明”让我想待在家里几天。
【解决方案2】:

我想你想要explicit operator

来自 MSDN 的示例:

// Must be defined inside a class called Farenheit:
public static explicit operator Celsius(Fahrenheit f)
{
    return new Celsius((5.0f / 9.0f) * (f.degrees - 32));
}

Fahrenheit f = new Fahrenheit(100.0f);
Console.Write("{0} fahrenheit", f.Degrees);
Celsius c = (Celsius)f;

【讨论】:

    【解决方案3】:

    你想在一个类上重载Cast operators

    【讨论】:

    • +1。不过,我认为implicit 运算符可能很危险。
    【解决方案4】:

    如果您没有任何特定的转换代码,System.Convert 方法最接近 Visual Basic 中的 CType。否则,可以从以下示例中看出:

    VB.NET

    Dim btn As Button = CType(obj, Button)
    

    C# 等效项:

    Button btn = (Button)obj
    

    Button btn = obj as Button
    

    【讨论】:

      猜你喜欢
      • 2011-05-23
      • 2015-06-04
      • 1970-01-01
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-08
      • 2013-05-17
      相关资源
      最近更新 更多