2014-12-17 4 views
0

Я думаю, что я не понимаю, что должно указывать свойство Type.IsByRef из .NET. Я думал, что он должен возвращать true для ссылочных типов и false для типов значений, поэтому противоположность Type.IsValueType. Я не могу заставить его возвращать true для типов, которые, очевидно, являются ссылочными типами. Вот пример:Тип.IsByRef всегда возвращает false

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); 
    } 
} 

Что мне здесь не хватает?

ответ

7

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).

+0

Спасибо! Это действительно работает, как вы объяснили. Я предполагаю, что пример в статье MSDN вводит в заблуждение. Ссылка: http://msdn.microsoft.com/en-us/library/system.type.isbyref%28v=vs.80%29.aspx –

+2

@S_F хорошо, это сложно ... не совсем; это правильно, но не очень четко сформулировано; есть разница между * типом, являющимся ссылочным типом *, а сам тип * является ссылкой *. В статье MSDN речь идет о последнем - вы говорите о первом. Обратите внимание, что вы можете иметь оба одновременно: ссылку на ссылочный тип (например, 'ref string') –

 Смежные вопросы

  • Нет связанных вопросов^_^