Создайте проект, который при запуске выводил бы на консоль 0. А после добавления ссылки на некоторую сборку выводил бы 1. Разница между двумя вариантами должна быть только в наличии ссылки на дополнительную сборку (никаких изменений в исходном коде), и оба варианта должны успешно компилироваться.
Хаки с рефлекшном или GetReferencedAssemblies() не считаются.
Здравствуйте, nikov, Вы писали:
N>Создайте проект, который при запуске выводил бы на консоль 0. А после добавления ссылки на некоторую сборку выводил бы 1. Разница между двумя вариантами должна быть только в наличии ссылки на дополнительную сборку (никаких изменений в исходном коде), и оба варианта должны успешно компилироваться.
N>Хаки с рефлекшном или GetReferencedAssemblies() не считаются.
Здравствуйте, Ovl, Вы писали:
Ovl>Здравствуйте, nikov, Вы писали:
N>>Создайте проект, который при запуске выводил бы на консоль 0. А после добавления ссылки на некоторую сборку выводил бы 1. Разница между двумя вариантами должна быть только в наличии ссылки на дополнительную сборку (никаких изменений в исходном коде), и оба варианта должны успешно компилироваться.
N>>Хаки с рефлекшном или GetReferencedAssemblies() не считаются.
Ovl>сборка любая или я могу её сделать?
тьфу
я имею ввиду сборка должна быть любой (System.Xml etc), или можно ограничиться одной (и я её сам и напишу)?
Здравствуйте, nikov, Вы писали:
N>Здравствуйте, Ovl, Вы писали:
Ovl>>я имею ввиду сборка должна быть любой (System.Xml etc), или можно ограничиться одной (и я её сам и напишу)?
N>Ты сам ее напишешь.
Здравствуйте, nikov, Вы писали:
N>Здравствуйте, Ovl, Вы писали:
Ovl>>С# 3.0 обязателен?
N>Ну я знаю решение с использованием C# 3.0, и не знаю — с более ранними версиями. Если найдешь, будет интересно.
ну если варианты с Activator-ом, а также ком-объектами подойдет — то могу найти
Здравствуйте, nikov, Вы писали:
N>Здравствуйте, Ovl, Вы писали:
Ovl>>ну если варианты с Activator-ом, а также ком-объектами подойдет — то могу найти
N>Нее, активатор — это рефлекшн.
Здравствуйте, 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;
}
}
}
Здравствуйте, 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
Здравствуйте, 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");
}
}
}
Здравствуйте, 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>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.
L> public static int Xxx(this object x) {
L> public static int Xxx(this string x) {
L>
Твое решение заметно короче и изящнее моего. Я думал про экстенжн методы, но почему-то решил, что из-за их низкого приоритета по сравнению с экземплярными методами ничего не выйдет. Почему-то не подумал про перегрузку методов из разных классов.
Но мое решение вообще не использует экстенжн методы. Может быть, кому-то будет интересно придумать, как это сделать.
Здравствуйте, desco, Вы писали:
N>>Ну я знаю решение с использованием C# 3.0, и не знаю — с более ранними версиями. Если найдешь, будет интересно.
D>пойдет ? D>Lib.cs D>App.cs
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.
Это правило работает, даже если экстенжн метод имеет лучшую сигнатуру, чем экземплярный метод.
Здравствуйте, 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) { }
}
}
Здравствуйте, nikov, Вы писали:
N>Создайте проект, который при запуске выводил бы на консоль 0. А после добавления ссылки на некоторую сборку выводил бы 1. Разница между двумя вариантами должна быть только в наличии ссылки на дополнительную сборку (никаких изменений в исходном коде), и оба варианта должны успешно компилироваться.
N>Хаки с рефлекшном или GetReferencedAssemblies() не считаются.
Разумеется, намёк на статические методы расширения... Вот как раз те грабли, которых я боюсь в новом C#.