我已经在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类型的目的是什么。这是某种我不知道的演员语法吗?在这里发生了什么使得这项工作和直接转换没有?
答案 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
:
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#中强制转换对象,则可以使用var
或dynamic
关键字完成类似的操作,但在大多数情况下我不建议这样做。类型检查是你的朋友。事实上,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;