2012-03-09 2 views
1

У меня есть переменный в FSharp интерактивныеFSharp интерактивные фу

val toto : obj = [["NKY INDEX"]] 

(я получил это значение от вызова к обычной библиотеке Dotnet, прототипом которой говорит мне, что это возвращает OBJ)

I хотел бы получить доступ к значению внутри него, но я точно не знаю тип. Поэтому я стараюсь, чтобы отразить на нем:

>toto.GetType();; 
val it : Type = 
    System.Object[,] 
    {Assembly = mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089; 
    AssemblyQualifiedName = "System.Object[,], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; 
    Attributes = AutoLayout, AnsiClass, Class, Public, Sealed, Serializable; 
    BaseType = System.Array; 
    ContainsGenericParameters = false; 
    CustomAttributes = seq [[System.SerializableAttribute()]]; 
    DeclaredConstructors = [|Void .ctor(Int32, Int32); 
           Void .ctor(Int32, Int32, Int32, Int32)|]; 
    DeclaredEvents = [||]; 
    DeclaredFields = [||]; 
    DeclaredMembers = [|Void Set(Int32, Int32, System.Object); 
         System.Object& Address(Int32, Int32); 
         System.Object Get(Int32, Int32); 
         Void .ctor(Int32, Int32); 
         Void .ctor(Int32, Int32, Int32, Int32)|]; 
    DeclaredMethods = [|Void Set(Int32, Int32, System.Object); 
         System.Object& Address(Int32, Int32); 
         System.Object Get(Int32, Int32)|]; 
    DeclaredNestedTypes = seq []; 
    DeclaredProperties = [||]; 

Он имеет Get метод, однако, когда я пытаюсь получить элемент, я получаю сообщение об ошибке.

>toto.Get(0,0);; 

    toto.Get(0,0);; 
    -----^^^ 

    error FS0039: The field, constructor or member 'Get' is not defined 

Каков правильный способ извлечения внутреннего элемента?

PS:. Литье это заранее дает тот же

>(toto :?> System.Object[,]).Get(0,0);; 

(toto :?> System.Object[,]).Get(0,0);; 
----------------------------^^^ 

error FS0039: The field, constructor or member 'Get' is not defined 

же для [0, 0]

> toto.[0, 0];; 

    toto.[0, 0];; 
    ^^^^^^^^^^^ 

error FS0039: The field, constructor or member 'Item' is not defined 
+0

Выражение 'toto: obj = [[" "]]' не должно даже компилироваться. – JaredPar

+0

Это неудачное следствие того, что список списков и многомерных массивов печатается аналогичным образом в FSI – desco

+0

@ JaredPar Я не упомянул, поскольку я думал, что отображаемая информация была достаточной, я получаю это значение от вызова функции dotnet. чей тип возврата, во всей красе, является объектом .... – nicolas

ответ

1

Я представляю

let arr = toto :?> obj[,] // downcast to actual type 
let item = arr.[0,0] 

является то, что вы хотите ,

+0

Что-то кажется нехорошим. Первоначальный тип должен быть «строковым списком» правильным? Идти с помощью 'val toto: obj = [[" "]]' sample. Который также не кажется, что он должен компилироваться без явного приведения. – JaredPar

+0

попытайтесь ввести код из моего ответа в FSI. исходный объект в коробке строка [,] – desco

+1

все еще опечатка; вторые должны быть обр. или в один конец: let item = (toto:?> obj [,]). [0,0] – Dirk

2
let toto = box (Array2D.init 1 1 (fun _ _ -> "NKY INDEX")) 
(toto :?> string[,]).[0,0] 
+0

У него есть 'obj [,]', да? Как будто строковый литерал внутри лямбда также помещен в коробку? – Brian

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