为什么这在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)
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))
因为在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)
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)