【问题标题】:Create a property name with the same name as a Keyword [duplicate]创建与关键字同名的属性名称[重复]
【发布时间】:2016-01-16 12:56:48
【问题描述】:

我确定以前有人问过这个问题,但我找不到我需要的答案。

我正在使用 C# 创建一个程序集,其中一个结构名为需要。我正在尝试执行以下操作:

internal struct need {
    internal need how
    {
        get
        {
            return how;
        }
    }
    internal need true
    {
        get
        {
            return true;
        }
    }
}

我想创建一个名为 true 的新属性。需要.true 显然 IDE 不喜欢这样,因为我正在尝试创建一个与关键字同名的属性。

显而易见的解决方法是将名称更改为其他名称,例如真实,但我的心告诉我,这不是我应该做的。

这真的让我的兴趣达到了顶峰。您理论上可以创建一个变量(或其他),并且程序集应该能够根据上下文和范围确定您所指的变量。如果我要说这样的话:(伪代码)

create int number
create need.int number

或者如果我做了类似的事情:

create int number // In the want struct
create int number // In the need struct

程序集根据上下文或范围确定我想要创建的类型应该没有问题。唯一的问题是 IDE 似乎没有使用正确的范围并且不允许我构建。

我试过了,true、need.true、this.true等都无济于事。

我确信让我的程序集确定它的“需要”结构中的“真”是什么对于它的功能来说是必不可少的,因为程序集需要能够在特定范围和上下文内使用它自己的真类型,不是任何语言或任何指定它的语言都指定它是什么。

我们如何做到这一点?

附:这些是属性的原因是我基本上可以将它们设为只读。如果你能告诉我如何将它们放在内部结构中并且只读......

【问题讨论】:

  • 用真代替真怎么样
  • 链接重复回答您的问题(使用@)。旁注:大多数人可能会认为命名与保留字冲突的属性是一个糟糕的想法,但这完全是基于意见的,如果你从不向其他人展示你的 C# 代码是可以的。请确保您未来的 SO 问题与该问题没有直接关系,使用常规名称并遵循默认的 C# 命名约定(即对类/属性使用大写 - Need

标签: c# syntax


【解决方案1】:

您可以在关键字前添加@

internal struct need
{
    // btw your properties will result in a infinit loop
    internal need how
    {
        get
        {
            return how;
        }
    }
    internal need @true
    {
        get
        {
            return @true;
        }
    }
}

编辑:

如果您需要从该属性返回true,则必须实现implicit operator need(bool)

internal struct need
{
    internal need @true
    {
        get { return true; }
    }

    public static implicit operator need(bool value)
    {
        // todo: initialize it
        return new need();
    }
}

或者,更改返回类型:

internal bool @true { get { return true; } }

【讨论】:

  • 我知道如何在结构中本质上声明一个内部只读“thingy”的唯一方法是使它成为一个只指定get而不设置的属性。我唯一能让它返回的就是它自己。我认为它最终会返回 null 或 void,而不是无限循环。程序集只需要知道需要是否存在,而不是它内部的值是什么,并且永远不会真正调用需要,它只会查看是否可以调用(如果存在)。我真的不明白使用@true 与使用单词真的有什么不同(不是吗?),我想让它来确定它自己的真实。
  • @true.get 中返回true 是没有意义的,因为返回类型是need 而不是bool。该评论仅基于您问题中提供的信息。
  • 感谢您的回复。不管它返回什么等等,你都没有回答这个问题。我问您如何使用相同的名称作为关键字,您的答案是使用不同的名称。不是我们需要的解决方案...
  • 如果你需要完全像need.true 那样使用它来进行一些反射黑客,那么你不能。但是,如果您通过反射检查,属性名称实际上是 "true" 而没有 @
  • 好吧,我想那可以工作吗?实际上,我真的不确定将 @ 放在它前面的确切作用。我知道您可以将它用于 sting 文字,这就是我在官方文档中可以找到的所有 @ 。在这里将 @ 放在它前面似乎只是某种命名约定,最终会变成一个不同的名称,比如使用大写 True,或者一个完全不同的名称,比如 foobar。必须有办法做到这一点,也许@我不确定(对不起,我一直在编辑。)
猜你喜欢
  • 1970-01-01
  • 2020-03-31
  • 2021-09-05
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-02
  • 2021-02-02
  • 2012-08-07
相关资源
最近更新 更多