F# - النوع int غير متوافق مع وحدة النوع
سؤال
جديد تمامًا على اللغات الوظيفية ، لكنني أحافظ على رمز شخص آخر مع الكثير من F#. هل يمكن لأي شخص أن يقدم بعض البصيرة في هذا؟
let mtvCap = Rendering.MTViewerCapture(mtViewer)
mtvCap.GetCapture()
mtvCap.ToWpfImage()
grid.Children.Add(mtvCap.ImageElement)
mtViewer.ImageViewer هو من النوع system.windows.controls.image ، والشبكة هي system.windows.controls.grid.
مرة أخرى ، الخطأ هو: النوع int غير متوافق مع وحدة النوع
المحلول
لا يسمح لك F# بتجاهل قيم الإرجاع بصمت. نوع unit
إصدار F#من void
. لذا فإن الخطأ يقول بشكل أساسي
كنت أتوقع ألا يعود البيان ولكن بدلاً من ذلك يعيد قيمة int
أو العكس. أميل إلى قراءة رسالة الخطأ هذه بشكل غير صحيح.
ما يحدث على الأرجح هو واحد مما يلي
- الطريقة المعنية هي توقع
int
قيمة الإرجاع ولكن الطريقةAdd
الإرجاع باطل ومن ثم F# يطلب فقط قيمة الإرجاع - يتم كتابة الطريقة المعنية
unit
لكنAdd
يعودint
و F# تحتاج إلى تجاهل القيمة. - ال
GetCapture
أوToWpfImage
قيم الإرجاع التي يجب التعامل معها بشكل صريح.
في حالتين آخرتين ، يمكنك إصلاح هذا عن طريق نقل القيمة إلى ignore
وظيفة
mtvCap.GetCapture() |> ignore
mtvCap.ToWpfImage() |> ignore
grid.Children.Add(mtvCap.ImageElement) |> ignore
بعد الحفر حوله قليلاً ، أعتقد أن #2 هو المشكلة لأن UIElementCollection.Add
يعود int
القيمة. حاول تعديل الخط النهائي لتبدو هكذا
grid.Children.Add(mtvCap.ImageElement) |> ignore
نصائح أخرى
لا أعرف سوى القليل عن F#، ولكن كما أتذكر ، فإن "الوحدة" هي طريقتهم في قول "void" ، لذلك سأخمن أنك تحاول تعيين "قيمة الإرجاع" للدالة التي لا تحتوي على واحدة ، إلى متنوع. هذا من شأنه أن يجعل المرشح الأكثر ترجيحًا ، هذا الخط:
let mtvCap = Rendering.MTViewerCapture(mtViewer)