Есть ли способ поддерживать «неявность» в методах расширения? [дублировать]C#

Место общения программистов C#
Ответить
Anonymous
 Есть ли способ поддерживать «неявность» в методах расширения? [дублировать]

Сообщение Anonymous »

В приведенном ниже коде можно ли переписать метод getbar () , чтобы не бросить исключение? />Got a BarA
Got a BarClass

Другими словами, правильный метод расширения вызывается, когда в первую очередь используется var . Затем код не удается при вызове метода, потому что мы переходим от «неявного» к «абстрактному», потому что аргумент метода не может быть var type.
Я думаю, что это есть чем заняться со статическим анализом, поскольку изменение var на foo.fooclass или foo.fooa приводит к двум различным результатам (успех или исключение).
the Базовый тип var не изменяется.
using System;

namespace Foo
{
public abstract class FooClass {}

public class FooA:FooClass {}

public class FooB:FooClass {}

}

namespace Bar
{
public abstract class BarClass {}

public class BarA:BarClass {}

public class BarB:BarClass {}

}

namespace AppLogic
{
public static class App
{
public static void Main()
{
var f = new Foo.FooA();
Bar.BarClass b = f.Parse();
Bar.BarClass b2 = GetBar(f);

}

static Bar.BarClass GetBar(Foo.FooClass f)
{
return f.Parse();
}

}

public static class Extensions
{
public static Bar.BarA Parse(this Foo.FooA foo)
{
Console.WriteLine("Got a BarA");
return new Bar.BarA();
}

public static Bar.BarClass Parse(this Foo.FooClass foo)
{
Console.WriteLine("Got a BarClass");
throw new InvalidOperationException();
}

public static Bar.BarB Parse(this Foo.FooB foo)
{
Console.WriteLine("Got a BarB");
return new Bar.BarB();
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/794 ... on-methods
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»