VB.NET 命名空间缩写:如何在等效的 C# 代码中实现此功能?

发布于 2025-01-03 13:48:43 字数 983 浏览 0 评论 0原文

我本质上是一名 VB.NET 程序员,但我很难弄清楚这一点。任何有关以下内容的帮助将不胜感激。

我需要让下面的 C# 代码 (1) 才能工作。 VB.NET 的等效项工作得很好,但 C# 却不行。

请注意,(2) 和 (3) 都可以工作,但这实际上是自动生成的代码,我需要 VB.NET 和 C# 版本尽可能相似。

  1. 这不会编译(Engine 的完全限定名称是 ThreeD.QVB.Engine):

    使用 ThreeD.QVB;
    
    命名空间 QVBScript
    {
        公共类脚本代码
        {
            公共无效主要(参考Engine.QVBObjectsDictionary对象,
                             Engine.Commands 命令)
            {
                ……
    
  2. 但是,这个 确实有效:

    //使用ThreeD.QVB; // 我在方法中使用完全限定名称
    
    命名空间 QVBScript
    {
        公共类脚本代码
        {
            公共无效主要(参考ThreeD.QVB.Engine.QVBObjectsDictionary对象,
                            ThreeD.QVB.Engine.Commands 命令)
            {
                ……
    
  3. 这也有效:

    using eng = ThreeD.QVB.Engine;
    
    命名空间 QVBScript
    {
        公共类脚本代码
        {
            public void Main(参考eng.QVBObjectsDictionary对象, 
                             eng.Commands 命令)
            {
                ……
    

I am a VB.NET programmer by nature and I am having a hard time figuring this out. Any help with the following would be appreciated.

I need to get the C# code (1) below to work. The VB.NET equivalent works just fine, but the C# does not.

Note that both (2) and (3) do work, but this is actually auto-generated code, and I need the VB.NET and C# versions to be as similar as possible.

  1. This does not compile (the fully-qualified name of Engine is ThreeD.QVB.Engine):

    using ThreeD.QVB;
    
    namespace QVBScript
    {
        public class ScriptCode
        {
            public void Main(ref Engine.QVBObjectsDictionary objects,
                             Engine.Commands commands)
            {
                …
    
  2. However, this does work:

    //using ThreeD.QVB; // I'm instead using fully-qualified names in the method
    
    namespace QVBScript
    {
        public class ScriptCode
        {
            public void Main(ref ThreeD.QVB.Engine.QVBObjectsDictionary objects,
                            ThreeD.QVB.Engine.Commands commands)
            {
                …
    
  3. This works, too:

    using eng = ThreeD.QVB.Engine;
    
    namespace QVBScript
    {
        public class ScriptCode
        {
            public void Main(ref eng.QVBObjectsDictionary objects, 
                             eng.Commands commands)
            {
                …
    

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

情绪少女 2025-01-10 13:48:43

在 VB.NET 中,如果您对命名空间的第一部分有导入,则可以仅引用后半部分。在 C# 中你不能这样做。您必须有一个 using 来表示完整的命名空间,或者完全限定您的类型名称。不同的语言,不同的规则。

在最后一个示例中,您不需要使用别名。

using ThreeD.QVB.Engine;

namespace QVBScript
{
    public class ScriptCode
    {
        public void Main(ref QVBObjectsDictionary objects, Commands commands)
        {
            UI.Output Output = (UI.Output)objects["Output"];

In VB.NET if you have an import for the first part of a namespace, you can reference just the later half. In C# you cannot do this. You must have a using for the full namespace, or fully qualify your type names. Different languages, different rules.

In your last example you do not need to use the alias.

using ThreeD.QVB.Engine;

namespace QVBScript
{
    public class ScriptCode
    {
        public void Main(ref QVBObjectsDictionary objects, Commands commands)
        {
            UI.Output Output = (UI.Output)objects["Output"];
诠释孤独 2025-01-10 13:48:43

要记住的基本规则:

using AB;

  • 确实允许您从命名空间 A 引用类型并且AB 无需使用其命名空间(同一文件中的任何位置)完全限定它们。

  • 不允许通过省略 AAB 的子命名空间来缩写名称名称中的 A.AB 部分。

namespace AB { … }

  • 确实允许您从命名空间 A引用类型 AB 无需使用其命名空间(块内)完全限定它们。

  • 确实允许您通过省略<来缩写AAB的子命名空间的名称code>A. 或 AB 部分来自其名称。


例子:

using System.Collections;

namespace A
{
  class Top : IDisposable, // importing System.Collections also imports System   
              IEnumerable, // inside the imported namespace
              System.Collections.Generic.IEnumerable<int>
  {…}                      // ^ "using" does not permit namespace abbreviation
}

namespace A.B
{
  class Middle : Top,      // namespace A available inside namespace A.B
                 C.IBottom // namespace blocks permit namespace abbreviation
  {…}
}

namespace A.B.C
{
  interface IBottom {…}
}

Basic rules to remember:

using A.B;

  • does allow you to refer to types from namespaces A and A.B without fully qualifying them with their namespace (everywhere in the same file).

  • does not allow you to abbreviate the names of sub-namespaces of A or A.B. by omitting the A. or A.B. part from their names.

namespace A.B { … }

  • does allow you to refer to types from namespaces A and A.B without fully qualifying them with their namespace (inside the block).

  • does allow you to abbreviate the names of sub-namespaces of A or A.B by omitting the A. or A.B. part from their names.


Example:

using System.Collections;

namespace A
{
  class Top : IDisposable, // importing System.Collections also imports System   
              IEnumerable, // inside the imported namespace
              System.Collections.Generic.IEnumerable<int>
  {…}                      // ^ "using" does not permit namespace abbreviation
}

namespace A.B
{
  class Middle : Top,      // namespace A available inside namespace A.B
                 C.IBottom // namespace blocks permit namespace abbreviation
  {…}
}

namespace A.B.C
{
  interface IBottom {…}
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文