سؤال

جديد تمامًا على اللغات الوظيفية ، لكنني أحافظ على رمز شخص آخر مع الكثير من 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

أو العكس. أميل إلى قراءة رسالة الخطأ هذه بشكل غير صحيح.

ما يحدث على الأرجح هو واحد مما يلي

  1. الطريقة المعنية هي توقع int قيمة الإرجاع ولكن الطريقة Add الإرجاع باطل ومن ثم F# يطلب فقط قيمة الإرجاع
  2. يتم كتابة الطريقة المعنية unit لكن Add يعود int و F# تحتاج إلى تجاهل القيمة.
  3. ال 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)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top