Matrimony Ответов: 2

C# общая проблема статического поля


public class base{ public string f1; }

public class Derive1{  }

public class Derive2{  }

void fun1<T>() where T: base
{
   T t = new T();
   string f = t.f1;
}


приведенный выше код работает хорошо.
Давайте изменим f1 на статическое поле.

Что я уже пробовал:

public class base{ public static string f1; }

public class Derive1{  }

public class Derive2{  }

void fun1<T>() where T: base
{   
   string f = T.f1;  // complie error
}


Как сделать так, чтобы этот код работал со статическим полем?

2 Ответов

Рейтинг:
15

raddevus

Почему этот код (мой измененный пример ниже) не работает? Я только что попробовал это в Linqpad (LINQPad - игровая площадка программиста .NET[^]);

void Main()
{
	main m = new main();
	main.f1 = "super";
	fun1<main>();

        Derive1 d = new Derive1();
	fun1<Derive1>();
}
public class main{ static  public string f1; }

public class Derive1: main{  }

public class Derive2 : main{  }

void fun1<T>() where T: main
{   
   string f = main.f1;  // NO compile error
   Console.WriteLine(f);
}


Выход будет таким :
super
super

это значение статической переменной. Вы не можете получить доступ к статике так, как вы это делали. Это переменная класса, а не переменная экземпляра. Ваш путь был доступ к примеру ВАР.

Редактировать
Изменил код и добавил экземпляр Derive1 и запустил метод с этим классом, и он тоже работает.
Теперь он выводит значение (super) дважды.


Рейтинг:
1

OriginalGriff

Вы не можете, не без рефлексии - дженерики не поддерживают ничего статичного. Это показывает, как использовать отражение, чтобы сделать это, если вы действительно должны. Но медленно: C# доступ к статическому свойству типа T в универсальном классе - переполнение стека[^]