VB vs C# - CType与ChangeType

时间:2018-05-01 07:00:34

标签: c# .net vb.net

为什么这在VB.Net中有效:

Dim ClipboardStream As New StreamReader(
    CType(ClipboardData.GetData(DataFormats.CommaSeparatedValue), Stream))

但是这会在C#中引发错误:

  

Stream是一个Type,在当前上下文中无效

ClipboardStream = new StreamReader(Convert.ChangeType(
    ClipboardData.GetData(DataFormats.CommaSeparatedValue), Stream));

说实话,我不是100%在转换类型上,我只是在代码片段中使用过它们,现在我正在尝试将简单的VB代码片段转换为C#版本...... / p>

4 个答案:

答案 0 :(得分:14)

ChangeType接受Type作为第二个参数,因此您应该写typeof(Stream)typeof(Stream)评估为表示类型Type的{​​{1}}实例。只使用Stream就行不通,因为它没有计算出值。这不是表达。

无论如何,你不应该在这里使用Stream,你应该施放,这是ChangeType的{​​{3}}:

CType

答案 1 :(得分:8)

CType是VB.Net中的编译器函数。它允许它的第二个参数是一个产生类型名称的表达式。你不能在VB或C#中编写这样的函数。

正如帕特里克所说,使用Convert的C#将是:

ClipboardStream = new StreamReader(Convert.ChangeType(
ClipboardData.GetData(DataFormats.CommaSeparatedValue),typeof(Stream)));

但如果这个是用VB编写的,那么这段代码就更接近了:

ClipboardStream = New StreamReader(Convert.ChangeType( _
ClipboardData.GetData(DataFormats.CommaSeparatedValue),GetType(Stream)))
VB中的

CType与C#中的强制转换更接近(例如(Stream)...而不是CType(..., Stream)

答案 2 :(得分:7)

因为传入C#中的类型与VB.NET中的类型不同。您应该使用typeof(Stream)

ClipboardStream = new StreamReader
                    ( Convert.ChangeType
                        ( ClipboardData.GetData(DataFormats.CommaSeparatedValue)
                        , typeof(Stream)
                        )
                    );

在这种情况下,简单的演员会更好:

ClipboardStream = new StreamReader
                    ( (Stream)ClipboardData.GetData(DataFormats.CommaSeparatedValue)
                    );

答案 3 :(得分:5)

Convert.ChangeType在其第二个参数中需要Type个参数。要从变量中获取Type实例,请调用GetType()方法或使用typeof运算符:

ClipboardStream = new StreamReader(Convert.ChangeType(
ClipboardData.GetData(DataFormats.CommaSeparatedValue), Stream.GetType()));


ClipboardStream = new StreamReader(Convert.ChangeType(
ClipboardData.GetData(DataFormats.CommaSeparatedValue), typeof(Stream)));

另一种方式(imo首选方式)是使用转换运算符

ClipboardStream = new StreamReader((Stream)ClipboardData.GetData(DataFormats.CommaSeparatedValue));