VB vs C# - CType与ChangeType

jam*_*art 13 .net c# vb.net

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

Dim ClipboardStream As New StreamReader(
    CType(ClipboardData.GetData(DataFormats.CommaSeparatedValue), Stream))
Run Code Online (Sandbox Code Playgroud)

但这是在C#中抛出一个错误:

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

ClipboardStream = new StreamReader(Convert.ChangeType(
    ClipboardData.GetData(DataFormats.CommaSeparatedValue), Stream));
Run Code Online (Sandbox Code Playgroud)

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

Swe*_*per 14

ChangeType接受a Type作为第二个参数,所以你应该写typeof(Stream).typeof(Stream)求值为Type表示类型的实例Stream.只是在Stream那里使用不起作用,因为它没有评估值.这不是表达.

无论如何,你不应该使用ChangeType反正在这里,你应该,这是C#等价CType:

 ClipboardStream = new StreamReader((Stream)ClipboardData.GetData(DataFormats.CommaSeparatedValue));
Run Code Online (Sandbox Code Playgroud)

  • 不,C# 的强制转换相当于 VB 的“DirectCast”。`CType` 可能执行可转换类型之间的转换。例如,“var myString = (string)myInt”甚至无法编译,“myInt as string”也无法编译,但“Ctype(myInt, String)”完全合法且有效。 (2认同)

Dam*_*ver 8

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

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

ClipboardStream = new StreamReader(Convert.ChangeType(
ClipboardData.GetData(DataFormats.CommaSeparatedValue),typeof(Stream)));
Run Code Online (Sandbox Code Playgroud)

但是这个代码更接近于如果是用VB编写的:

ClipboardStream = New StreamReader(Convert.ChangeType( _
ClipboardData.GetData(DataFormats.CommaSeparatedValue),GetType(Stream)))
Run Code Online (Sandbox Code Playgroud)

CType在VB更接近大量铸造在C#(例如(Stream)...,而不是CType(..., Stream))


Pat*_*man 7

因为在C#中传入类型与在VB.NET中传递不同.你应该使用typeof(Stream):

ClipboardStream = new StreamReader
                    ( Convert.ChangeType
                        ( ClipboardData.GetData(DataFormats.CommaSeparatedValue)
                        , typeof(Stream)
                        )
                    );
Run Code Online (Sandbox Code Playgroud)

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

ClipboardStream = new StreamReader
                    ( (Stream)ClipboardData.GetData(DataFormats.CommaSeparatedValue)
                    );
Run Code Online (Sandbox Code Playgroud)


Adr*_*ian 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)));
Run Code Online (Sandbox Code Playgroud)

另一种方式(imo首选方式)是使用铸造操作员

ClipboardStream = new StreamReader((Stream)ClipboardData.GetData(DataFormats.CommaSeparatedValue));
Run Code Online (Sandbox Code Playgroud)