[C# 3.0, Этюд] Add Reference
От: nikov США http://www.linkedin.com/in/nikov
Дата: 16.06.08 16:16
Оценка:
Создайте проект, который при запуске выводил бы на консоль 0. А после добавления ссылки на некоторую сборку выводил бы 1. Разница между двумя вариантами должна быть только в наличии ссылки на дополнительную сборку (никаких изменений в исходном коде), и оба варианта должны успешно компилироваться.

Хаки с рефлекшном или GetReferencedAssemblies() не считаются.
этюд
Re: [C# 3.0, Этюд] Add Reference
От: Ovl Россия  
Дата: 16.06.08 16:48
Оценка:
Здравствуйте, nikov, Вы писали:

N>Создайте проект, который при запуске выводил бы на консоль 0. А после добавления ссылки на некоторую сборку выводил бы 1. Разница между двумя вариантами должна быть только в наличии ссылки на дополнительную сборку (никаких изменений в исходном коде), и оба варианта должны успешно компилироваться.


N>Хаки с рефлекшном или GetReferencedAssemblies() не считаются.


сборка любая или я могу её сделать?
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[2]: [C# 3.0, Этюд] Add Reference
От: Ovl Россия  
Дата: 16.06.08 16:50
Оценка:
Здравствуйте, Ovl, Вы писали:

Ovl>Здравствуйте, nikov, Вы писали:


N>>Создайте проект, который при запуске выводил бы на консоль 0. А после добавления ссылки на некоторую сборку выводил бы 1. Разница между двумя вариантами должна быть только в наличии ссылки на дополнительную сборку (никаких изменений в исходном коде), и оба варианта должны успешно компилироваться.


N>>Хаки с рефлекшном или GetReferencedAssemblies() не считаются.


Ovl>сборка любая или я могу её сделать?

тьфу

я имею ввиду сборка должна быть любой (System.Xml etc), или можно ограничиться одной (и я её сам и напишу)?
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[3]: [C# 3.0, Этюд] Add Reference
От: nikov США http://www.linkedin.com/in/nikov
Дата: 16.06.08 16:53
Оценка:
Здравствуйте, Ovl, Вы писали:

Ovl>я имею ввиду сборка должна быть любой (System.Xml etc), или можно ограничиться одной (и я её сам и напишу)?


Ты сам ее напишешь.
Re[4]: [C# 3.0, Этюд] Add Reference
От: Ovl Россия  
Дата: 16.06.08 16:56
Оценка:
Здравствуйте, nikov, Вы писали:

N>Здравствуйте, Ovl, Вы писали:


Ovl>>я имею ввиду сборка должна быть любой (System.Xml etc), или можно ограничиться одной (и я её сам и напишу)?


N>Ты сам ее напишешь.


С# 3.0 обязателен?
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[5]: [C# 3.0, Этюд] Add Reference
От: nikov США http://www.linkedin.com/in/nikov
Дата: 16.06.08 17:00
Оценка:
Здравствуйте, Ovl, Вы писали:

Ovl>С# 3.0 обязателен?


Ну я знаю решение с использованием C# 3.0, и не знаю — с более ранними версиями. Если найдешь, будет интересно.
Re[6]: [C# 3.0, Этюд] Add Reference
От: Ovl Россия  
Дата: 16.06.08 17:03
Оценка:
Здравствуйте, nikov, Вы писали:

N>Здравствуйте, Ovl, Вы писали:


Ovl>>С# 3.0 обязателен?


N>Ну я знаю решение с использованием C# 3.0, и не знаю — с более ранними версиями. Если найдешь, будет интересно.

ну если варианты с Activator-ом, а также ком-объектами подойдет — то могу найти
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[7]: [C# 3.0, Этюд] Add Reference
От: nikov США http://www.linkedin.com/in/nikov
Дата: 16.06.08 17:05
Оценка:
Здравствуйте, Ovl, Вы писали:

Ovl>ну если варианты с Activator-ом, а также ком-объектами подойдет — то могу найти


Нее, активатор — это рефлекшн.
Re[8]: [C# 3.0, Этюд] Add Reference
От: Ovl Россия  
Дата: 16.06.08 17:14
Оценка:
Здравствуйте, nikov, Вы писали:

N>Здравствуйте, Ovl, Вы писали:


Ovl>>ну если варианты с Activator-ом, а также ком-объектами подойдет — то могу найти


N>Нее, активатор — это рефлекшн.


ну хорошо... так подойдет?
static void Main(string[] args)
{
  Console.WriteLine(File.Exists("target.dll") ? 0 : 1);
}
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re: [C# 3.0, Этюд] Add Reference
От: Lloyd Россия  
Дата: 16.06.08 17:27
Оценка: 31 (2)
Здравствуйте, nikov, Вы писали:

N>Создайте проект, который при запуске выводил бы на консоль 0. А после добавления ссылки на некоторую сборку выводил бы 1. Разница между двумя вариантами должна быть только в наличии ссылки на дополнительную сборку (никаких изменений в исходном коде), и оба варианта должны успешно компилироваться.


N>Хаки с рефлекшном или GetReferencedAssemblies() не считаются.


using System;

namespace ConsoleApplication7 {
    public static class Extensions {
        public static int Xxx(this object x) {
            return 0;
        }
    }
    class Program {
        static void Main() {

            Console.WriteLine("Re[3]: [C# 3.0, Этюд] Add Reference".Xxx());
        }
    }
}


Другая сборка:
namespace ConsoleApplication7 {
    public static class Extensions2 {
        public static int Xxx(this string x) {
            return 1;
        }
    }
}
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re[2]: [C# 3.0, Этюд] Add Reference
От: Niemand Австралия  
Дата: 16.06.08 18:08
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, nikov, Вы писали:


N>>Создайте проект, который при запуске выводил бы на консоль 0. А после добавления ссылки на некоторую сборку выводил бы 1. Разница между двумя вариантами должна быть только в наличии ссылки на дополнительную сборку (никаких изменений в исходном коде), и оба варианта должны успешно компилироваться.


N>>Хаки с рефлекшном или GetReferencedAssemblies() не считаются.


L>Другая сборка:

L>
L>namespace ConsoleApplication7 {
L>    public static class Extensions2 {
L>        public static int Xxx(this string x) {
L>            return 1;
L>        }
L>    }
L>}
L>


странно, extension метод имеет меньший приоритет чем метод обычный. Такой код "не выстрелил":

    public partial class Class1
    {
        public int Get(object o){ return 0;}
    }

...

    public static class Class1Extension
    {
        public static int Get(this Class1 cls, string s1)
        {
            return 1;
        }
    }

...

              Class1 c = new Class1();

            Console.WriteLine(c.Get("zzz"));


этот код возвращал 0, как будто extension метода и нет вовсе (хотя интелисенс показывал методы как перегруженные).
If the message above is in English — means I'm wasting my work time and work computer to post here. No hard feelings
Re[3]: [C# 3.0, Этюд] Add Reference
От: Хэлкар  
Дата: 16.06.08 18:18
Оценка:
Не совсем понял, у меня сработало.
Re: [C# 3.0, Этюд] Add Reference
От: desco США http://v2matveev.blogspot.com
Дата: 16.06.08 18:57
Оценка: 30 (1)
Здравствуйте, nikov, Вы писали:

N>Создайте проект, который при запуске выводил бы на консоль 0. А после добавления ссылки на некоторую сборку выводил бы 1. Разница между двумя вариантами должна быть только в наличии ссылки на дополнительную сборку (никаких изменений в исходном коде), и оба варианта должны успешно компилироваться.


N>Хаки с рефлекшном или GetReferencedAssemblies() не считаются.



using System;
using Etude.Extension;

namespace Etude
{
    namespace Extension
    {
        public static class IntExtension
        {
            public static void Do(this int n)
            {
                Console.WriteLine("0");
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            1.Do();
        }
    }
}



using System;

namespace Etude
{
    public static class Extension
    {
        public static void Do(this int n)
        {
            Console.WriteLine("1");
        }
    }
}
Re[6]: [C# 3.0, Этюд] Add Reference
От: desco США http://v2matveev.blogspot.com
Дата: 16.06.08 19:05
Оценка: 126 (5)
Здравствуйте, nikov, Вы писали:

N>Здравствуйте, Ovl, Вы писали:


Ovl>>С# 3.0 обязателен?


N>Ну я знаю решение с использованием C# 3.0, и не знаю — с более ранними версиями. Если найдешь, будет интересно.


пойдет ?
Lib.cs

using System;

namespace Etude
{
    public static class Util
    {
        public static void Do(int n)
        {
            Console.WriteLine("1");
        }
    }
}


App.cs

using System;
using Etude.Inner;

namespace Etude
{
    namespace Inner
    {
        public static class Util
        {
            public static void Do(int n)
            {
                Console.WriteLine("0");
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Util.Do(0);
        }
    }
}


c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727>csc App.cs
Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.3031
for Microsoft (R) Windows (R) 2005 Framework version 2.0.50727
Copyright (C) Microsoft Corporation 2001-2005. All rights reserved.


c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727>App
0

c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727>csc App.cs /r:Lib.dll
Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.3031
for Microsoft (R) Windows (R) 2005 Framework version 2.0.50727
Copyright (C) Microsoft Corporation 2001-2005. All rights reserved.


c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727>App
1

Re[2]: [C# 3.0, Этюд] Add Reference
От: nikov США http://www.linkedin.com/in/nikov
Дата: 16.06.08 19:08
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>
L>        public static int Xxx(this object x) {
L>        public static int Xxx(this string x) {
L>




Твое решение заметно короче и изящнее моего. Я думал про экстенжн методы, но почему-то решил, что из-за их низкого приоритета по сравнению с экземплярными методами ничего не выйдет. Почему-то не подумал про перегрузку методов из разных классов.
Но мое решение вообще не использует экстенжн методы. Может быть, кому-то будет интересно придумать, как это сделать.
Re[7]: [C# 3.0, Этюд] Add Reference
От: nikov США http://www.linkedin.com/in/nikov
Дата: 16.06.08 19:25
Оценка:
Здравствуйте, desco, Вы писали:

N>>Ну я знаю решение с использованием C# 3.0, и не знаю — с более ранними версиями. Если найдешь, будет интересно.


D>пойдет ?

D>Lib.cs
D>App.cs


Да, очень красивое решение!
Re[3]: [C# 3.0, Этюд] Add Reference
От: nikov США http://www.linkedin.com/in/nikov
Дата: 16.06.08 19:33
Оценка: +1
Здравствуйте, Niemand, Вы писали:


N>странно, extension метод имеет меньший приоритет чем метод обычный.


Это ничуть не странно. Это прямо написано в спецификации:

7.5.5.2 Extension method invocations
....
The preceding rules mean that instance methods take precedence over extension methods, that extension methods available in inner namespace declarations take precedence over extension methods available in outer namespace declarations, and that extension methods declared directly in a namespace take precedence over extension methods imported into that same namespace with a using namespace directive.


Это правило работает, даже если экстенжн метод имеет лучшую сигнатуру, чем экземплярный метод.
Re: [C# 3.0, Этюд] Add Reference
От: midcyber
Дата: 16.06.08 20:09
Оценка: 20 (1)
Здравствуйте, nikov, Вы писали:

N>Создайте проект, который при запуске выводил бы на консоль 0. А после добавления ссылки на некоторую сборку выводил бы 1. Разница между двумя вариантами должна быть только в наличии ссылки на дополнительную сборку (никаких изменений в исходном коде), и оба варианта должны успешно компилироваться.


N>Хаки с рефлекшном или GetReferencedAssemblies() не считаются.


Я поучаствую =)

Сборка 1

using SystemConsole = System.Console;
using Test;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            SystemConsole.WriteLine(System.UInt32.MinValue);
            SystemConsole.ReadKey();
        }
    }
}


Сборка 2


namespace Test
{
    public class System
    {
        public class UInt32
        {
            public static byte MinValue { get { return 1; } }
        }

        static void Main(string[] args) { }
    }
}


Я думаю, это 2.0 в том числе...
Re: [C# 3.0, Этюд] Add Reference
От: vdimas Россия  
Дата: 17.06.08 08:21
Оценка:
Здравствуйте, nikov, Вы писали:

N>Создайте проект, который при запуске выводил бы на консоль 0. А после добавления ссылки на некоторую сборку выводил бы 1. Разница между двумя вариантами должна быть только в наличии ссылки на дополнительную сборку (никаких изменений в исходном коде), и оба варианта должны успешно компилироваться.


N>Хаки с рефлекшном или GetReferencedAssemblies() не считаются.


Разумеется, намёк на статические методы расширения... Вот как раз те грабли, которых я боюсь в новом C#.
Re[2]: [C# 3.0, Этюд] Add Reference
От: nikov США http://www.linkedin.com/in/nikov
Дата: 17.06.08 08:56
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Разумеется, намёк на статические методы расширения... Вот как раз те грабли, которых я боюсь в новом C#.


На самом деле есть по крайней мере еще одно решение, без методов-расширений и без пространств имен.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.