Считаются ли библиотеки .NET framework определяемыми пользователем?

В документации C# довольно часто используется термин "определяемый пользователем". Например:

Оператор as не может выполнять... пользовательские преобразования...

Хотя я не встречал формального определения, я предполагаю, что все, не в спецификации языка C#, определяется пользователем.

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

Кажется очевидным, что int и double не определяются пользователем; однако с String и DateTime все менее ясно.

Как насчет всего, что является частью библиотек Framework, но не частью C#? Ответ Ювала указывает, что библиотеки Framework не определяются пользователем, тогда как ответ Патрика указывает, что они есть.


person Shaun Luttin    schedule 16.03.2015    source источник
comment
Есть ли что-то конкретное, что вы не уверены в использовании? Обычно это означает что-то, созданное разработчиком (то есть вами)   -  person Sayse    schedule 16.03.2015
comment
comment
@ShaunLuttin - Извиняюсь, я, кажется, неправильно прочитал цитату (каким-то образом). Пользователь всегда тот, кто использует .Net Framework, вы/ваша команда/разработчик(и)   -  person Sayse    schedule 16.03.2015
comment
В этом контексте определяемые пользователем означают неявные и явные операторы. Я не уверен, почему вы смущены DateTime и String. Очевидно, что они не определяются пользователем.   -  person Sriram Sakthivel    schedule 16.03.2015


Ответы (3)


полное предложение, на которое вы ссылаетесь:

Обратите внимание, что оператор as выполняет только преобразования ссылок, преобразования, допускающие значение NULL, и преобразования упаковки. Оператор as не может выполнять другие преобразования, например определяемые пользователем преобразования, которые вместо этого следует выполнять с помощью выражений приведения.

В этом случае определяемые пользователем преобразования — это преобразования, которые не обрабатываются самим языком. Например, язык обрабатывает преобразования между числовыми типами. Эти преобразования встроены в компилятор и довольно сложны, поскольку они не отражают «нормальное» поведение языка (сейчас, когда они его построили).

В тех случаях, которые не охвачены компилятором, вам нужно сделать приведение самостоятельно. Для этого вы можете использовать оператор преобразования, как описано здесь в MSDN.

И прямо отвечая на вопрос заголовка: Да. Библиотеки платформы .NET считаются определяемыми пользователем.

person Patrick Hofman    schedule 16.03.2015

Обычно определяемое пользователем означает все, что определено пользователем (разработчиком). Но с точки зрения C#, то, что не реализовано в CLR или C#, будет определяться пользователем.

Это означает, что даже если он реализован в библиотеках .Net framework, он классифицируется как определяемый пользователем.

Например, существует явный оператор преобразования из XElement в string; он реализован в .Net framework(BCL) как явный оператор. Тем не менее, это преобразование, определяемое пользователем.

Согласно приведенной ниже цитате

Оператор as не может выполнять... пользовательские преобразования...

Вы не можете использовать оператор as для выполнения пользовательского преобразования (явного в данном случае), тем не менее, он предоставляется BCL.

Например, следующий фрагмент не будет компилироваться:

string someString = "someString";
XElement element = new XElement("SomeElement", "Value");

someString = (string)element;//Cast just works fine
someString = element as string;//You can't use as keyword here

Таким образом, в этом контексте определяемым пользователем является все, что не предоставляется C# или CLR; .Net framework здесь не исключение.

person Sriram Sakthivel    schedule 16.03.2015

потому что компилятор C# можно реализовать на C#.

Определенно возможно

Кажется очевидным, что int и double не определяются пользователем; однако с String и DateTime все не так ясно.

Конверсии, определяемые пользователем, означают точно так же, как это выглядит, конверсии, определенные пользователем. Вы можете увидеть, как это четко указано в Определяемый пользователем Учебник по конверсиям:

C# позволяет программистам объявлять преобразования в классах или структурах, чтобы классы или структуры можно было преобразовывать в другие классы или структуры или базовые типы и/или из них. Преобразования определяются как операторы и называются по типу, в который они преобразуются.

Теперь для этого:

Как насчет всего, что является частью .NET, но не частью C#?

.NET Framework = библиотеки базовых классов + среда выполнения. Все типы, предоставляемые BCL, являются частью фреймворка. string и DateTime также являются частью фреймворка. Вы можете самостоятельно создавать различные типы, которые являются определяемыми пользователем типами, что означает, что вы создали их, потому что они еще не были доступны в BCL для вас. Существуют встроенные диалоги для примитивных типов, которые известны компилятору. Другие определенные преобразования подпадают под определяемые пользователем.

person Yuval Itzchakov    schedule 16.03.2015
comment
Кто именно пользователь? Например, считаются ли пользователями те, кто пишет основные библиотеки .NET? - person Shaun Luttin; 16.03.2015
comment
stackoverflow.com/questions/631059 / указывает, что компилятор можно реализовать на C#, хотя мне не хватает знаний, чтобы это подтвердить. - person Shaun Luttin; 16.03.2015
comment
@ShaunLuttin Новый компилятор C# написан на C# и называется Roslyn. Смотрите мою ссылку. Кто именно пользователь? Любой, кто пишет код, который не входит в стандартную комплектацию платформы .NET. - person Yuval Itzchakov; 16.03.2015
comment
Удаление действительно? поправил бы пост. - person Shaun Luttin; 16.03.2015
comment
Если кто-то, кроме меня, пишет библиотеку, которая не является частью BCL, а затем я ссылаюсь на его/ее библиотеку, считается ли все это также определяемым пользователем? - person Shaun Luttin; 16.03.2015