为什么这在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>
答案 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));