1111 Нет, они не совсем не связаны. void
- это тип, который ( C11 6.2.5p19 )
содержит пустой набор значений; это неполный тип объекта, который не может быть завершен.
blockquote>И
void *
- это тип указателя, который указывает на объект указанного типа.Любой тип указателя объекта может быть преобразован в другой тип указателя объекта с явным приведением , учитывая, что указатель соответствующим образом выровнен; единственное преобразование между типами указателей, которое может произойти без преобразования в C, - это преобразования в
void *
и обратно; отсюда статусvoid *
как тип общего указателя.Тип
void
сам по себе может использоваться для других задач - например, выражение может быть приведено кvoid
, чтобы сигнализировать, что значение намеренно игнорируется, или использоваться как тип возвращаемого значения, чтобы сигнализировать, что функция не возвращает значение. Единственная семантическая перегрузка - использованиеvoid
в прототипе:int func(void)
, чтобы сигнализировать, что функция не принимает никаких аргументов.
[<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);
}
}
}
Теперь, дайте мне мою долбаную медаль!
Несмотря на мой другой ответ, я действительно просто пробовал это 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.
На спецификацию языка разделите 10,7 "Расширений типа":
Дополнительные дополнительные участники являются синтаксическим сахаром для статических участников. Использование дополнительных дополнительных участников уточняет к вызовам статическим участникам с закодированными именами, куда объект передается как первый аргумент. Кодирование имен не указано в этом выпуске F# и не совместимо с кодировкой C# дополнительных участников C#