(अपडेट किया गया: मैं एक रेप्रो उदाहरण जोड़ लिया है)जिज्ञासु त्रुटियों जब स्पष्ट सदस्य बाधाओं के साथ इनलाइन संयोजन
कोड निम्नलिखित की तरह लग रही है:
type Lib =
static member inline tryMe (a: ^a) =
let name = (^a: (static member name: string)())
name
type Test =
struct
val Value: string
new v = {Value = v}
end
static member inline name with get() = "HiThere"
static member works(a:Test) = Lib.tryMe a
यह "बस काम" और संकलित कर देगा । हालांकि, अगर आप इसे थोड़ा विस्तार, उदाहरण के लिए इस प्रकार की तरह:
/// Does a bounds check and raises an error if bounds check is not met
let inline checkBounds f (g: 'b -> ^c) (tp: ^a) =
let convertFrom = (^a: (static member name: string)())
let convertTo = (^c: (static member name : string)())
let value = (^a: (member Value: 'b) tp)
if f value then
g value
else
failwithf "Cannot convert from %s to %s." convertFrom convertTo
type ConverterA =
struct
val Value: sbyte
new v = { Value = v }
end
static member inline name with get() = "converter-a"
static member inline convert (x: ConverterA) : ConverterB =
checkBounds ((>=) 0y) (byte >> ConverterB) x
and ConverterB =
struct
val Value: byte
new v = { Value = v }
end
static member inline name with get() = "converter-b"
यह नकली FSharp संकलक त्रुटियों की एक पूरी गुच्छा बढ़ा देंगे।
त्रुटि FS1114: मान 'Foo.Bar.name' इनलाइन चिह्नित किया गया था लेकिन अनुकूलन वातावरण में बाध्य नहीं था
त्रुटि FS1113: मूल्य 'नाम' इनलाइन चिह्नित किया गया था लेकिन इसकी कार्यान्वयन बनाता है एक आंतरिक या निजी समारोह जो पर्याप्त सुलभ
चेतावनी FS1116 नहीं है के उपयोग: 'इनलाइन' के रूप में चिह्नित एक मूल्य एक अप्रत्याशित मूल्य है
त्रुटि FS1118: टी इनलाइन करने में विफल वह 'नाम' चिह्नित 'इनलाइन' महत्व देते हैं, शायद इसलिए कि एक पुनरावर्ती मूल्य 'इनलाइन'
मैं अन्य इनलाइन कार्यों के साथ हो रहा नहीं देखा है चिह्नित किया गया था। मुझे यकीन नहीं है कि यहां क्या होता है। अगर मैं थोड़ा सा बदलता हूं, उदाहरण के लिए convertTo
लाइन और इसकी निर्भरताओं को हटा दें, तो यह ठीक से संकलित करता है।
एफएसआई में कोड चलाते समय त्रुटियां भी दिखाई नहीं देती हैं, यहां तक कि एफएसआई --optimize
के साथ स्थापित है।
मैं inline
को हटा कर इसके आसपास काम कर सकता हूं। इस तरह के खेतों के लिए इससे कोई फर्क नहीं पड़ता, जेआईटी इनलाइन करेगा, भले ही एफ # नहीं है।
क्या यह एक कंपाइलर बग है? या क्या मेरे कोड में कोई त्रुटि है, या स्पष्ट सदस्य बाधाओं पर कुछ प्रतिबंध मुझे पता नहीं है?
के रूप में वास्तव में अन्य प्रश्न के साथ, यह एक समाधान के रूप हल करती है, लेकिन तथ्य यह है कि यह है (शायद) एफ # में एक बग के रूप में आदेश यहाँ अप्रासंगिक माना जाता है को दूर नहीं करता: [मेरी बग रिपोर्ट से कल] (https://github.com/Microsoft/visualfsharp/issues/1565)। – Abel
यह सच है, रिपोर्टिंग के लिए धन्यवाद। जैसा कि मैंने दूसरी टिप्पणी में कहा था, मुझे लगता है कि संकलक को पता नहीं है कि उस बिंदु पर इनलाइन क्यों करना है जहां वह इनलाइन करने की कोशिश करता है। – CodeMonkey