为什么结构不能有外部属性,但方法可以吗?

时间:2010-08-04 06:55:18

标签: .net

请注意以下代码:

[AttributeUsage(AttributeTargets.All)]
public class XAttribute : Attribute
{
}

public struct A
{
  [X]
  public static extern int XX { get; }
}

这不编译。错误消息显示

  

修饰符'extern'无效   这个项目

但是,以下代码编译好了:

[AttributeUsage(AttributeTargets.All)]
public class XAttribute : Attribute
{
}

public struct A
{
  [X]
  public static extern int GetXX();
}

为什么???

修改

伙计们,伙计们。如果我没有真正的申请,我不会问。我明白,理解为什么某些东西按照它们的方式定义的纯粹的学术兴趣不是激励我们一些人的东西,所以这里是脚踏实地的动机。我有一个PostSharp属性,它将一定的逻辑注入到属性的extern属性中。具体来说,真实代码如下所示:

[LoggerAccessProperty]
private static extern ILog Logger { get; }

PostSharp处理LoggerAccessProperty方面并注入实际的getter方法,该方法表明私有静态编译器生成了ILog实例。这是我们内部扩展Log4PostSharp软件包的一部分。当时,我们在PostSharp谷歌代码网站上发布了Log4PostSharp的扩展版本,这个属性是我最近添加的,尚未发布。

EDIT2

请注意,以下代码编译得很好:

[AttributeUsage(AttributeTargets.All)]
public class XAttribute : Attribute
{
}

public class A
{
  [X]
  public static extern int XX { get; }
}

区别在于A是这里的一个类,而不是struct。

EDIT3

我使用的是.NET 4。

4 个答案:

答案 0 :(得分:1)

结构中不允许使用

extern属性。

答案 1 :(得分:1)

  

extern修饰符用于   声明实现的方法   外部

以上是extern关键字的第一行文档。 (重点补充)。鉴于它只适用于方法(不是属性),人们不得不问:你甚至试图做什么?事实上它是一个结构而不是一个类,并且代码示例中存在一个属性似乎都是红色的鲱鱼。

答案 2 :(得分:0)

  

因为外部方法声明没有提供实际的实现,所以没有方法体;方法声明只以分号结尾,签名后面没有大括号({})。

因此,如果您将代码更改为:

[LoggerAccessProperty]
private static extern ILog Logger();

它应该在你的结构中正常工作。

Reference Link

答案 3 :(得分:0)

它看起来像编译器中的错误(不会被修复)。属性访问器被编译为JSIL中的方法,因此您可以使用get_XXX方法来解决。