【问题标题】:Type.IsByRef always returning false [duplicate]Type.IsByRef 总是返回 false [重复]
【发布时间】:2014-12-17 13:24:56
【问题描述】:

我想我不明白 .NET 中的 Type.IsByRef 属性应该表示什么。我认为它应该对引用类型返回 true,对值类型返回 false,因此与 Type.IsValueType 属性相反。但是,对于明显是引用类型的类型,我无法让它返回 true。这是一个例子:

using System.Text;

public class Program
{
    static void Main(string[] args)
    {
        try
        {
            int i = 0;
            Console.WriteLine(i.GetType().IsByRef);    // returns false - OK

            Exception e = new Exception();
            Console.WriteLine(e.GetType().IsByRef);    // returns false - ??

            StringBuilder sb = new StringBuilder();
            Console.WriteLine(sb.GetType().IsByRef);   // returns false - ??
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }

        Console.ReadKey(true);
    }
}

我在这里错过了什么?

【问题讨论】:

    标签: c# .net-2.0


    【解决方案1】:

    IsByRef对于通过引用传递的参数为真:

    public void Foo(ref int x) { }
    ...
    
    var fooMethod = this.GetType().GetMethod("Foo");
    var param = fooMethod.GetParameters()[0];
    bool isByRef = param.ParameterType.IsByRef; // true
    

    它与值类型和引用类型无关。要检查一个类型是否是值类型,请检查IsValueType(对于值类型返回 true,否则返回 false)。

    【讨论】:

    • 谢谢!它确实像你解释的那样工作。我想 MSDN 文章中的例子是误导性的。链接:msdn.microsoft.com/en-us/library/…
    • @S_F 好吧,这很棘手……不完全;是对的,但措辞不是很清楚; 类型是引用类型类型本身是引用之间是有区别的。 MSDN 文章谈论的是后者——您谈论的是前者。请注意,您可以同时拥有两者:对引用类型的引用(例如ref string
    猜你喜欢
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    相关资源
    最近更新 更多