Код, который почему-то работает в C# (взят из
следующего примера) не компилируется в Немерле. При этом почему он работает в C# мне тоже непонятно
(хотя я не эксперт в .NET):
C#:
using Microsoft.VisualStudio.VCProjectEngine;
class A
{
public static void Main()
{
VCProjectEngine engine = new VCProjectEngineObject();
System.Console.WriteLine(engine);
}
}
D:\MyProjects\Scripts>csc testcs.cs /reference:"D:\Development\Visual Studio 200
5\Common7\IDE\PublicAssemblies\microsoft.visualstudio.vcprojectengine.dll"
Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.42
for Microsoft (R) Windows (R) 2005 Framework version 2.0.50727
Copyright (C) Microsoft Corporation 2001-2005. All rights reserved.
D:\MyProjects\Scripts>testcs
Microsoft.VisualStudio.VCProjectEngine.VCProjectEngineObjectClass
Как видно в первом случае инстанцируется объект VCProjectEngineObjectClass.
Nemerle:
[c#]
using Microsoft.VisualStudio.VCProjectEngine;
class A
{
public static Main() : void
{
def engine = VCProjectEngineObject() :> VCProjectEngine;
System.Console.WriteLine(engine);
}
}
[/c#]
D:\MyProjects\Scripts>ncc testn.n /reference:"D:\Development\Visual Studio 2005\
Common7\IDE\PublicAssemblies\microsoft.visualstudio.vcprojectengine.dll"
testn.n:7:21:7:42: <[01;31merror<[0m: none of the meanings of `VCProjectEngineOb
ject' meets the type ?:
testn.n:7:21:7:42: <[01;31merror<[0m: the type `Microsoft.VisualStudio.VCProje
ctEngine.VCProjectEngineObject' is abstract and cannot be constructed
D:\MyProjects\Scripts>testcs
Microsoft.VisualStudio.VCProjectEngine.VCProjectEngineObjectClass
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Здравствуйте, Андрей Хропов, Вы писали:
АХ>Код, который почему-то работает в C# (взят из следующего примера) не компилируется в Немерле. При этом почему он работает в C# мне тоже непонятно (хотя я не эксперт в .NET):
АХ>C#:
АХ>АХ>using Microsoft.VisualStudio.VCProjectEngine;
АХ>class A
АХ>{
АХ> public static void Main()
АХ> {
АХ> VCProjectEngine engine = new VCProjectEngineObject();
АХ> System.Console.WriteLine(engine);
АХ> }
АХ>}
АХ>
АХ>АХ>D:\MyProjects\Scripts>csc testcs.cs /reference:"D:\Development\Visual Studio 200
АХ>5\Common7\IDE\PublicAssemblies\microsoft.visualstudio.vcprojectengine.dll"
АХ>Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.42
АХ>for Microsoft (R) Windows (R) 2005 Framework version 2.0.50727
АХ>Copyright (C) Microsoft Corporation 2001-2005. All rights reserved.
АХ>D:\MyProjects\Scripts>testcs
АХ>Microsoft.VisualStudio.VCProjectEngine.VCProjectEngineObjectClass
дело в аттрибуте CoClassAttribute(typeof(VCProjectEngineObjectClass)), которым помечен интерфейс VCProjectEngineObject
компилятор C# превращает код
VCProjectEngine engine = new VCProjectEngineObject();
в
Microsoft.VisualStudio.VCProjectEngine.VCProjectEngine engine = new VCProjectEngineObjectClass();
Интересно, а что талкает вместо русского слова "создание", "соданием" использовать эту кривую кальку?
Плюс как можно создавать что-то абстрактное?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Здравствуйте, Андрей Хропов, Вы писали:
АХ>При этом почему он работает в C# мне тоже непонятно (хотя я не эксперт в .NET):
АХ>Как видно в первом случае инстанцируется объект VCProjectEngineObjectClass.
В C# он работает потому, что C# компилятор знает кое-что важное про COM Interop-обёртки и подставляет создание конкретного класса обёртки. Думаю, что C# компилятор узнаёт тип конкретного класса из атрибута System.Runtime.InteropServices.CoClassAttribute, который цепляется к интерфейсу из interop сборки, созданному для COM объекта, так что теоретически можно делать то же самое и в Nemerle. Но вот нужно ли?...
Здравствуйте, Oyster, Вы писали:
O>Здравствуйте, Андрей Хропов, Вы писали:
АХ>>При этом почему он работает в C# мне тоже непонятно (хотя я не эксперт в .NET):
АХ>>Как видно в первом случае инстанцируется объект VCProjectEngineObjectClass.
O>В C# он работает потому, что C# компилятор знает кое-что важное про COM Interop-обёртки и подставляет создание конкретного класса обёртки. Думаю, что C# компилятор узнаёт тип конкретного класса из атрибута System.Runtime.InteropServices.CoClassAttribute, который цепляется к интерфейсу из interop сборки, созданному для COM объекта, так что теоретически можно делать то же самое и в Nemerle. Но вот нужно ли?...
Наверное нужно. Почему нет? А то так вот подобные примеры кода из MSDN сложно будет портировать с C# на Nemerle. Хотя лучше всего почитать описывается ли такое поведение в стандарте на CLI.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>