在 .NET 世界中"mark a field as literal"意味着什么?



根据微软的文档,如果:

FieldInfo.GetValue(object)将抛出NotSupportedException

"一个字段被标记为文字,但该字段没有可接受的文字类型。"

我不知道这是什么意思

"将字段标记为文字。"

我想了解这一点,这样我就可以知道如何防止这种异常

literalconst字段。每个const字段的值都是在编译时由字面量初始化确定的。看看这段代码

using System;
using System.Reflection;

public class Program
{
    const int literal_int = 5;
    readonly int literal_int_two = 5;
    const string literal_string = "Fun";
    const Random literal_random = null;
    int non_literal;
    public static void Main()
    {
        foreach (FieldInfo f in typeof(Program).GetFields(BindingFlags.Instance 
        | BindingFlags.NonPublic
        | BindingFlags.Static
        | BindingFlags.FlattenHierarchy))
        {
            Console.WriteLine("{0} is literal - {1}", f.Name, f.IsLiteral);
            try
            {
                Console.WriteLine("GetValue = {0}", f.GetValue(null));
            }
            catch{}
        }
    }
}
输出:

literal_int is literal - True
GetValue = 5
literal_int_two is literal - False
literal_string is literal - True
GetValue = Fun
literal_random is literal - True
GetValue = 
non_literal is literal - False
然而,

,但该字段没有可接受的文字类型之一

是开放的解释,我找不到一个没有"被接受的文字类型之一"(不管这意味着什么)的文字的例子。

通过简单地查看源代码,我找不到一个相对的代码片段来表示这个异常。忽略此子句是安全的。

看看FieldInfo.IsLiteral属性:

获取一个值,该值指示是否在编译时写入该值并且不能更改。

IsLiteral属性是在fieldatattributes。文字属性。如果设置了此属性,则该字段不能为已更改且为常量。

"一个字段被标记为文字,但该字段没有可接受的文字类型之一。"

…必须与由动态或自定义代码创建的FieldInfo实例相关(而不是通过Reflection收集),其中通常会延迟或省略某些验证。

FieldInfo对象包含表示字段的元数据,但是它的类是可继承的,任何派生的实现都可能允许不良的类型条件。

相关内容

  • 没有找到相关文章

最新更新