遵守下列守则:
[AttributeUsage(AttributeTargets.All)]
public class XAttribute : Attribute
{
}
public struct A
{
[X]
public static extern int XX { get; }
}这不编译。错误信息显示
修饰符“extern”对此项无效。
但是,下面的代码编译OK:
[AttributeUsage(AttributeTargets.All)]
public class XAttribute : Attribute
{
}
public struct A
{
[X]
public static extern int GetXX();
}为什么?
编辑
伙计们伙计们。如果我没有真正的申请,我是不会问的。我明白,纯粹的学术兴趣来理解为什么某些事物被定义为他们的方式并不能激励我们中的一些人,所以这里是脚踏实地的动机。我有一个PostSharp属性,它向属性外接属性注入某种逻辑。具体来说,真正的代码如下所示:
[LoggerAccessProperty]
private static extern ILog Logger { get; }其中,PostSharp处理LoggerAccessProperty方面并注入实际的getter方法,该方法显示私有静态编译器生成的ILog实例。这是我们对Log4PostSharp包内部扩展的一部分。当时,我们已经在Log4PostSharp代码站点上发布了PostSharp的扩展版本,这个属性是我最近添加的,但还没有发布。
EDIT2
注意,以下代码编译得很好:
[AttributeUsage(AttributeTargets.All)]
public class XAttribute : Attribute
{
}
public class A
{
[X]
public static extern int XX { get; }
}区别是A是一个类,而不是结构。
EDIT3
我正在使用.NET 4。
发布于 2010-08-04 07:08:59
结构中不允许使用extern属性。
发布于 2010-08-04 07:15:53
外露修饰符用于声明外部实现的方法。
以上是extern关键字的第一行文档。(加重音)。考虑到它只适用于方法(而不是属性),人们不得不问:你到底想做什么?事实上,它是一个结构而不是一个类,并且在代码示例中存在一个属性,这两者似乎都是红色鲱鱼。
发布于 2010-08-04 10:06:59
因为外部方法声明没有提供实际的实现,所以没有,也没有方法主体;方法声明只是以分号结尾,签名之后没有大括号({ })。
因此,如果您将代码更改为:
[LoggerAccessProperty]
private static extern ILog Logger();它在你的结构中应该能正常工作。
参考链接
https://stackoverflow.com/questions/3403249
复制相似问题