Методы расширения F# в C#

1111 Нет, они не совсем не связаны. void - это тип, который ( C11 6.2.5p19 )

содержит пустой набор значений; это неполный тип объекта, который не может быть завершен.

blockquote>

И void * - это тип указателя, который указывает на объект указанного типа.

Любой тип указателя объекта может быть преобразован в другой тип указателя объекта с явным приведением , учитывая, что указатель соответствующим образом выровнен; единственное преобразование между типами указателей, которое может произойти без преобразования в C, - это преобразования в void * и обратно; отсюда статус void * как тип общего указателя.

Тип void сам по себе может использоваться для других задач - например, выражение может быть приведено к void, чтобы сигнализировать, что значение намеренно игнорируется, или использоваться как тип возвращаемого значения, чтобы сигнализировать, что функция не возвращает значение. Единственная семантическая перегрузка - использование void в прототипе: int func(void), чтобы сигнализировать, что функция не принимает никаких аргументов.

35
задан abatishchev 12 March 2014 в 05:28
поделиться

3 ответа

[<System.Runtime.CompilerServices.Extension>]
module Methods =   
    [<System.Runtime.CompilerServices.Extension>]   
    let Exists(opt : string option) =                
    match opt with
       | Some _ -> true                  
       | None -> false

Этот метод мог использоваться в C# только путем добавления пространства имен (использующий использующий) в файл, где это будет использоваться.

if (p2.Description.Exists()) {   ...}

Вот ссылка на исходное сообщение в блоге.

Ответ на вопрос в комментариях "Дополнительные Статические методы":

namespace ExtensionFSharp 

module CollectionExtensions = 

  type System.Linq.Enumerable with   
    static member RangeChar(first:char, last:char) = 
      {first .. last}

В F# Вы называете его как так:

open System.Linq 
open ExtensionFSharp.CollectionExtensions 

let rangeChar = Enumerable.RangeChar('a', 'z') 
printfn "Contains %i items" rangeChar.CountItems

В C# Вы называете его как так:

using System;
using System.Collections.Generic;
using ExtensionFSharp;

    class Program
    {
        static void Main(string[] args)
        {
            var method = typeof (CollectionExtensions).GetMethod("Enumerable.RangeChar.2.static");


            var rangeChar = (IEnumerable<char>) method.Invoke(null, new object[] {'a', 'z'});
            foreach (var c in rangeChar)
            {
                Console.WriteLine(c);
            }
        }
    }

Теперь, дайте мне мою долбаную медаль!

48
ответ дан alex 27 November 2019 в 06:54
поделиться

Несмотря на мой другой ответ, я действительно просто пробовал это F# CTP (на оболочке VS) и Экспресс C# от моего поля дома (все свободные dev инструменты!), и это работает:

F#

#light
namespace MyFSharp

// C# way
[<System.Runtime.CompilerServices.Extension>]
module ExtensionMethods =
    [<System.Runtime.CompilerServices.Extension>]
    let Great(s : System.String) = "Great"

    // F# way
    type System.String with
        member this.Awesome() = "Awesome"
    let example = "foo".Awesome()        

C#

using System;
using MyFSharp;  // reference the F# dll
class Program
{
    static void Main(string[] args)
    {
        var s = "foo";
        //s.Awesome(); // no
        Console.WriteLine(s.Great());  // yes
    }
}

Я не знал, что Вы могли сделать это; острота. Кредит к @alex.

16
ответ дан Brian 27 November 2019 в 06:54
поделиться

На спецификацию языка разделите 10,7 "Расширений типа":

Дополнительные дополнительные участники являются синтаксическим сахаром для статических участников. Использование дополнительных дополнительных участников уточняет к вызовам статическим участникам с закодированными именами, куда объект передается как первый аргумент. Кодирование имен не указано в этом выпуске F# и не совместимо с кодировкой C# дополнительных участников C#

6
ответ дан Brian 27 November 2019 в 06:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: