使用HttpWebRequest.Create时的C#vs VB语法

时间:2015-03-23 19:04:44

标签: c# vb.net

我已经在VB中编写了很长一段时间,我也可以在C#和F#中做很多事情,但是VB和C#之间的一个语法差异继续让我失望。我是谷歌这个,但我不确定该怎么称呼它。请考虑以下示例:

在visual basic中我会这样做:

Dim Request As HttpWebRequest = HttpWebRequest.Create("www.google.com")

然而,当我做出似乎是"逻辑"转换为C#:

HttpWebRequest Request = HttpWebRequest.Create("www.google.com");

我得到了隐式类型转换错误。在看了一些其他代码后,我意识到这似乎是正确的方法:

HttpWebRequest Request = (HttpWebRequest)HttpWebRequest.Create("www.google.com");

但是我并不完全清楚在括号中另外提到HttpWebRequest类型的目的是什么。这是某种我不知道的演员语法吗?在这里发生了什么使得这项工作和直接转换没有?

5 个答案:

答案 0 :(得分:5)

首先,,该语法是显式广播(有时称为C风格演员)。

你需要它的原因很简单。 Create方法实际上是从WebRequest类继承的,它返回WebRequest(非HttpWebRequest)对象。请注意HttpWebRequest中缺少其存在以及Create

的签名

分配给HttpWebRequest变量然后需要向下转换,这绝不保证是安全的,所以你必须明确地转换它。

请注意,以下代码编译。

WebRequest Request = HttpWebRequest.Create("www.google.com");

答案 1 :(得分:3)

正如其他人所说,HttpWebRequest.Create方法不会返回转换为HttpWebRequest类型的对象。相反,它返回一个HttpWebRequest对象强制转换为其基本WebRequest类型。正如您所发现的,在C#中,您需要将对象显式地转换为所需的类型。

然而,您的困惑在于您认为不需要在VB.NET中执行强制转换操作。你不需要使用VB.NET进行转换的唯一原因是因为你有Option Strict Off。如果您在VB.NET中转为Option Strict On,就像您最有可能那样,那么您将需要执行转换,就像在C#中一样:

Dim Request As HttpWebRequest = DirectCast(HttpWebRequest.Create("www.google.com"), HttpWebRequest)

当您拥有Option Strict On

时,这是Visual Studio显示的编译器错误
  

Option Strict On禁止从“System.Net.WebRequest”到“System.Net.HttpWebRequest”的隐式转换。

如果您拥有Option Strict Off,VB.NET将为您执行扩展转换,而不会发出任何警告。这可能很方便,但它会关闭一些编译器类型检查,这可能会为您捕获一些错误。我的经验法则是始终转动Option Strict On,除非您需要它Off

换句话说,通过转动Option Strict On,正如大多数人所推荐的那样,VB.NET的类型检查与C#的工作方式相同。如果您不想在C#中强制转换对象,则可以使用vardynamic关键字完成类似的操作,但在大多数情况下我不建议这样做。类型检查是你的朋友。事实上,C#中的类型转换语法更容易,这使得它更加方便。

答案 2 :(得分:2)

HttpWebRequest.Create会返回WebRequest

HttpWebRequest.Create确实会返回从HttpWebRequest派生的WebRequest,但编译器不知道它实际上是HttpWebRequest,但它确实知道你'重新尝试将其放入HttpWebRequest类型的变量中。

这就是你必须明确输入它的原因。

答案 3 :(得分:1)

这是因为您的VB项目中Option Strict被设置为off。如果你转动它on隐式缩小转换就会像在C#中那样产生编译错误。你必须在VB中写下以下内容:

Dim Request As HttpWebRequest = DirectCast(HttpWebRequest.Create("www.google.com"), HttpWebRequest)

这等于C#的

HttpWebRequest Request = (HttpWebRequest)HttpWebRequest.Create("www.google.com");

答案 4 :(得分:1)

您可以使用:

var Request = HttpWebRequest.Create("www.google.com") as HttpWebRequest;