【问题标题】:How can I fix this short snippet of VB that was translated from C#?如何修复这个从 C# 翻译的 VB 短片段?
【发布时间】:2012-02-02 11:25:29
【问题描述】:

我得到了这个在 Visual Studio 2010 中完美运行的 C# sn-p:

使用系统; 使用 System.Web.UI.WebControls;

public partial class MasterPage : System.Web.UI.MasterPage
{
protected void Page_Load(object sender, EventArgs e)
{
}

protected void RequestLanguageChange_Click(object sender, EventArgs e)
{
    LinkButton senderLink = (LinkButton)sender;
    Response.Redirect(Request.RawUrl.ApplyCultureToUrl(senderLink.CommandArgument));
}
}

每个在线转换器(和 SharpDevelop)都会在 VB 中将其翻译成这个:

Imports System
Imports System.Web.UI.WebControls

Public Partial Class MasterPage
Inherits System.Web.UI.MasterPage
Protected Sub Page_Load(sender As Object, e As EventArgs)
End Sub

Protected Sub RequestLanguageChange_Click(sender As Object, e As EventArgs)
Dim senderLink As LinkButton = DirectCast(sender, LinkButton)

Response.Redirect(Request.RawUrl.ApplyCultureToUrl(senderLink.CommandArgument))
End Sub
End Class

VS 也在做同样的事情:

Public NotInheritable Class Localization
Private Sub New()
End Sub
<System.Runtime.CompilerServices.Extension()> _
Public Shared Function ApplyCultureToUrl(rawUrl As String, culture As String) As String
Dim modifiedUrl As String

System.Runtime.CompilerServices.Extension只能在模块中运行。

问题:

在 Visual Studio 2010 中,Request.RawUrl.ApplyCultureToUrl 带有蓝色下划线,它不提供解决方案。它只是说 ApplyCultureToUrl 不是“字符串”的成员。这是阻止我的解决方案工作的唯一原因!

我在 MSDN 上进行了研究,它说错误意味着它必须被模块包围,但不是编码器,我不知道如何修复它。 sn-p 是为了帮助我的 ?lang=en-GB 查询字符串出现在我的多语言网站中。任何帮助将不胜感激!


更新:我有 ApplyCulturetoUrl 的工作,只需单击 Visual Studio 中的很多图标,它就会吐出这个:

Partial Public Class MasterPage
Inherits System.Web.UI.MasterPage
Protected Sub Page_Load(sender As Object, e As EventArgs)
End Sub

Protected Sub RequestLanguageChange_Click(sender As Object, e As EventArgs)
    Dim senderLink As LinkButton = DirectCast(sender, LinkButton)
    Response.Redirect(ApplyCultureToUrl(Request.RawUrl, senderLink.CommandArgument))
End Sub

Private Sub body()
    Throw New NotImplementedException
End Sub

Private Function ApplyCultureToUrl(p1 As String, p2 As String) As String
    Throw New NotImplementedException
End Function
End Class

这并没有给我任何错误,虽然我不知道它是否正确......呵呵......现在,给我一个错误的代码的唯一其他部分是在本地化.vb,一个类,是这样的:

Public NotInheritable Class Localization
Private Sub New()
End Sub
<System.Runtime.CompilerServices.Extension()> _
Public Shared Function ApplyCultureToUrl(rawUrl As String, culture As String) As String
 Dim modifiedUrl As String

并且 System.Runtime.CompilerServices.Extension() 用波浪形的蓝色下划线表示扩展方法只能在模块中定义。我正在使用您的所有建议!感谢您的坚持!

【问题讨论】:

  • 我感觉这将是一种扩展方法,在另一个项目的其他地方定义。在 C# 解决方案中,右键单击并选择“转到定义”,这应该可以帮助您找到它。
  • 嘿,失望,我认为你是对的!当我去定义时,有很多选择,我不知道该选择哪一个!不过谢谢!

标签: c# vb.net extension-methods c#-to-vb.net


【解决方案1】:

看起来ApplyCultureToUrl是一个扩展方法。

解决这个问题就像导入定义了ApplyCultureToUrl 的命名空间一样简单。

但它可能比这更复杂:

在 VB.Net 中,扩展方法必须在一个模块中,这必须是公共的,以引用其他项目的扩展。要包含它们,您只需要引用包含的程序集并导入正确的命名空间。

VB.Net 扩展方法的 MSDN 页面是here

【讨论】:

  • 谢谢乔恩...我在努力! 现在给我最大的麻烦,说它必须在模块中定义!
  • 就是这样。阅读我链接的 MSDN 页面,因为它很好地涵盖了这些内容 - 您需要在项目中使用一个模块(而不是类)来定义您的扩展方法。
  • 创建一个普通函数并将要更改的脚本作为参数传递可能更容易。
  • @JonEgerton 您可以在VB.Net中使用另一个程序集中编写的扩展方法;我经常这样做。我不知道是什么导致你得出相反的结论,因为所有程序集都是 IL,无论源是 VB 还是 C#。
  • 乔恩,我不想因为这么简单的事情打扰你,但是当它说 System.Runtime.CompilerServices.Extension() 带有波浪线的蓝色下划线时,我可以传递什么样的参数或方法说扩展方法只能在模块中定义。?我不是程序员,我们公司太小,雇不到一个,所以我很启发式,通过编辑、上传和刷新等方式学习......再次感谢您的耐心,Jon!
【解决方案2】:

将光标放在 C# 文件中的 ApplyCultureToUrl 关键字上,然后按 F12 键。该方法在某处定义为扩展方法。

不知道Visual Basic是否支持扩展方法,如果没有,可以在VB本地定义:

Private Function ApplyCultureToUrl(RawUrl as String, Command as String) As String
   // body
End Function

在这种情况下,您将按如下方式调用它:

Response.Redirect(ApplyCultureToUrl(Request.RawUrl, senderLink.CommandArgument))

【讨论】:

  • VB.Net 确实支持扩展,但不是很好(它们必须在一个模块中!)
  • 该解决方案几乎奏效了,Artem。但现在它用绿色强调了 End Function,并说“ApplytoCultureURL”不会在所有代码路径上返回值。使用结果时,可能会在运行时发生空引用异常。嘘!这让我发疯了!
  • @JasonWeber 在上面的答案中,\\body,您正在插入一些代码,对吗? Artem 想让你找到 C# 扩展方法并将其翻译成 VB,并放在上面写着\\body 的位置
  • 马克,在这方面我太不聪明了,我很抱歉。我将重做整个事情(时间不长——我需要 10 分钟)并报告回来。你们所有人都非常慷慨地提供帮助。我感谢 Jon、Artem 和你 Mark。我确实阅读了约翰的 MSDN 页面,并尝试了一些东西,但 VS 一直给我错误。谢谢大家的耐心。我现在正在重做,大约 10 点回来!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-27
  • 1970-01-01
  • 2016-02-24
  • 2015-10-11
  • 1970-01-01
  • 2021-10-17
相关资源
最近更新 更多