2013-11-25 2 views
4

Я пытаюсь, чтобы имя возвращало значение item.name, где item является экземпляром класса C#.Ошибка: может потребоваться аннотация типа

файл фс содержит

namespace PatternMatch 

type PatternMatch() = 
    member this.X = "F#" 

namespace Items_ 

файл содержит FSX

#load "PatternMatch.fs" 
open PatternMatch 

open Items_ 

type item = Item 

let Name item = item.name //this line throws the error 

let rec sentence s item = function 
    | s when s="Action" -> "" 
    | s when s="Client" -> "" 
    | s when s="Classifier" -> ""  
    | s when s="Container" -> ""  
    | s when s="ControlFlow" -> "" 
    | s when s="Gaurd" -> "" 
    | s when s="Name" -> Name item 
    | s when s="ObjectFlow" -> ""  
    | s when s="Source" -> ""  
    | _ -> "" 

let Name item = item.name бросает ошибку. Items_ - это пространство имен C#, а Item - это класс C# внутри.

Вся ошибка:

Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. C:\Users\jzbedocs\Local Files\Visual Studio 2010\Projects\addin\trunk\PatternMatch\Script.fsx 11 17 PatternMatch

+0

Вам нужна аннотация типа для 'item' паров из' функции name'. –

+0

не является типом строки item = Элемент аннотации? Элемент - класс C#. – user3033411

+0

@ user3033411 'type item = Item' создает псевдоним типа. В 'let Name (item: Item) = item.Name' param 'item' имеет аннотацию типа' Item'. –

ответ

4

let Name item = item.name не имеет аннотацию типа. Параметр item ничем не ограничен иначе, чем ограничение члена, которое не поддерживается неявно (см here за то, что явно - не делайте этого ...)

Похоже, что вы запутались, потому что имя параметра item является то же, что и псевдоним типа item. Если вы хотите явно сделать это так сделать:

let Name (itemParameter:item) = itemParameter.name 

Я не проверил, если параметр может иметь такое же имя, как псевдоним, но это, вероятно, плохая идея, так как это может быть путать с (мы только что видели это!).

Редактировать: Хорошо, я проверил. Вы можете иметь имя параметра будет таким же, как аннотированный типа параметра, но это приводит к чудовищно запутанной сигнатурой типа и реализации:

Если вы чувствуете себя особенно зло, вы могли бы даже сделать что-то вроде это:

> let item (item:item) : item = item;; 

val item : item:item -> item //Huh? 

Как и в сторону:

let rec sentence s item = function 
    | s when s="Action" -> "" 
    | s when s="Client" -> "" 
    | s when s="Classifier" -> ""  
    | s when s="Container" -> ""  
    | s when s="ControlFlow" -> "" 
    | s when s="Gaurd" -> "" 
    | s when s="Name" -> Name item 
    | s when s="ObjectFlow" -> ""  
    | s when s="Source" -> ""  
    | _ -> "" 

, вероятно, лучше выражена как:

let rec sentence s item = 
    match s with 
    | "Action" -> "" 
    | "Client" -> "" 
    | "Classifier" -> ""  
    | "Container" -> ""  
    | "ControlFlow" -> "" 
    | "Gaurd" -> "" //Guard maybe? 
    | "Name" -> Name item 
    | "ObjectFlow" -> ""  
    | "Source" -> ""  
    | _ -> "" 

Вот рабочий пример, используя простое определение Item (показано с помощью Repl):

> type Item() = 
    member val name = "" with get,set 
type item = Item 

let Name (itemParameter:item) = itemParameter.name 

let test = item();; 
test.name <- "test" 
Name test;; 

val it : string = "test" 
+1

Я думаю, вы имеете в виду '... = itemParameter.name'. Если вы нашли сообщение полезным, отметьте его как ответ. :-) – mydogisbox

+0

Спасибо всем за помощь. этот стиль программирования кажется очень отличным от C#. Изменение строки на «let Name (itemParameter: item) = itemParameter.name« изменяет поле «ошибка», «конструктор» или «имя участника» не определено. мне не нравится, когда я добавляю элемент под типом. и не нравится 'type item (name: string)' – user3033411

+0

Можете ли вы добавить определение 'Item'? Это «Имя», а не «имя»?Я не уверен, что вы пытаетесь сделать с типом item (name: string) ', это недопустимый синтаксис. – mydogisbox

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